ios - update - upcoming elections in india 2019




UICollectionViewFlowLayout साइज वॉर्निंग जब लैंडस्केप डिवाइस को घुमाएगी (14)

हम सेल को प्रदर्शित करने के लिए एक UICollectionView का उपयोग कर रहे हैं जो पूर्ण स्क्रीन (स्थिति और नौसेना बार) को कवर करता है। सेल का आकार self.collectionView.bounds.size से सेट किया self.collectionView.bounds.size :

- (void)viewWillAppear:(BOOL)animated
{
    //
    // value isn't correct with the top bars until here
    //
    CGSize tmpSize = self.collectionView.bounds.size;
    _currentCellSize = CGSizeMake( (tmpSize.width), (tmpSize.height));
}

- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout*)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath {

    return _currentCellSize;
}

यह प्रत्येक डिवाइस के लिए सही आकार निर्धारित करता है। प्रत्येक सेल में कोई इनसेट नहीं होने के लिए परिभाषित किया गया है, और लेआउट में कोई हेडर या पाद नहीं है। हालाँकि, जब हम चित्र से परिदृश्य की ओर घूमते हैं तो हमें निम्नलिखित "शिकायत" मिलती है:

the behavior of the UICollectionViewFlowLayout is not defined because:
the item height must be less that the height of the UICollectionView minus the section insets top and bottom values.

अब मैं इस त्रुटि को समझता हूं, हालांकि हम सेल के आकार को रीसेट करते हैं और रोटेशन संक्रमण में निर्मित प्रवाह लेआउट का उपयोग करते हैं:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    //self.collectionView.bounds are still the last size...not the new size here
}
- (void)didRotateFromInterfaceOrientation: UIInterfaceOrientation)fromInterfaceOrientation
{
    CGSize tmpSize = self.collectionView.bounds.size;
    _currentCellSize = CGSizeMake( (tmpSize.width), (tmpSize.height));
    [self.collectionView performBatchUpdates:nil completion:nil];//this will force the redraw/size of the cells.
}

परिदृश्य में कोशिकाएं सही ढंग से प्रस्तुत करती हैं।

ऐसा लगता है जैसे फ्लो लेआउट पुराने सेल आकार को देखता है (जो शिकायत का कारण बनता है क्योंकि यह बहुत लंबा होगा), लेकिन didRotateFromInterfaceOrientation में नए सेल आकार सेट को पढ़ / प्रस्तुत करता है।

क्या शिकायत से छुटकारा पाने का कोई तरीका है?

हमने एक डिवाइस को घुमाने वाले संक्रमण के दौरान एक और हुक खोजने की कोशिश की है जिसमें सही लक्ष्य स्क्रीन आकार (वर्तमान स्क्रीन आकार बनाम) का उपयोग बिना किसी भाग्य के किया गया है। डिबग आउटपुट से पता चलता है कि शिकायत willRotateToInterfaceOrientation बाद willRotateToInterfaceOrientation लेकिन इससे पहले कि didRotateFromInterfaceOrientation

हमने स्पष्ट भी सत्यापित किया है; अगर हम सेल की ऊँचाई को एक निश्चित आकार के परिदृश्य स्क्रीन की ऊँचाई से कम करने के लिए सेट करते हैं, तो शिकायत नहीं होती है। इसके अलावा, लैंडस्केप से पोर्ट्रेट तक घूमते समय शिकायत नहीं होती है।

सब कुछ ठीक चलता है, और सही तरीके से प्रस्तुत होता है। हालाँकि यह शिकायत हमें चिंतित करती है। किसी और के पास कोई विचार या समाधान है?


IOS 7 पर इन चेतावनियों को चुप कराने का उपाय खोजने की कोशिश करना मेरे लिए मुश्किल साबित हो रहा था। मैंने अपना UICollectionView सहारा UICollectionView और निम्नलिखित कोड जोड़ा।

- (void)setFrame:(CGRect)frame
{
    if (!iOS8 && (frame.size.width != self.frame.size.width))
    {
        [self.collectionViewLayout invalidateLayout];
    }

    [super setFrame:frame];
}

कुछ CGSizeEqualToSize() साथ पूरे आकार की जांच करना चाहते हैं।


UICollectionView के फ्रेम का आकार बदलने पर मैं उसी समस्या में भाग गया। अगर मैंने सेल के आकार को वापस करने के लिए FlowLayout पर प्रतिनिधि विधि का उपयोग किया (जो कि UICollectionView के आकार के आधार पर अद्यतन किया जाएगा), तो मुझे त्रुटि संदेश तब मिलेगा जब मैंने UICollectionView के फ्रेम का आकार छोटा (छोटा) किया शिकायत करने से पहले प्रतिनिधि को अद्यतन आकार की जानकारी के लिए पूछना नहीं था। यह अंततः आकार जानकारी के लिए प्रतिनिधि विधि पूछेगा जब redrawing, लेकिन यह अभी भी चेतावनी जारी करेगा जब मैंने एक नया फ्रेम विधि सौंपा। चेतावनी से छुटकारा पाने के लिए, मैंने फ्रेम को एक नए छोटे मूल्य पर सेट करने से पहले स्पष्ट रूप से UICollectionViewFlowLayout ऑब्जेक्ट की आइटम सेट करें। मेरी स्थिति काफी सरल है कि मुझे लगता है कि मैं इस बिंदु पर आइटमसाइज़ गणना करने के साथ दूर हो सकता हूं (क्योंकि संग्रह दृश्य में मेरे सभी आइटम समान आकार हैं), प्रतिनिधि पद्धति के आधार पर। आइटम को सेट करने के दौरान आइटम सेट करें संपत्ति को लागू करते समय प्रतिनिधि विधि को लागू करने से समस्या का समाधान नहीं हुआ , क्योंकि मुझे लगता है कि उसने आइटम के मूल्य को अनदेखा कर दिया है यदि यह पता चला कि प्रतिनिधि विधि लागू हुई थी (यदि यह जानता है कि यह वहां है, तो इसे कॉल क्यों नहीं करता है ?!)। उम्मीद है कि यह मदद करता है - शायद आप रोटेशन से पहले आइटम को स्पष्ट रूप से सेट कर सकते हैं।


आप UICollectionView कर सकते हैं और UICollectionView को ओवरराइड कर सकते हैं:। कॉल करने से पहले [super setBounds:] आइटम का आकार नए सीमा में समायोजित किया जा सकता है।
आपको जांचना चाहिए कि क्या सीमा का आकार बदल गया है, क्योंकि setBounds: स्क्रॉल करते समय भी setBounds:


इस लोड पर एक और चिंराट फेंकने के लिए नहीं, फिर भी अस्वीकार्य, बार्बी।

- (CGSize)collectionView:(UICollectionView *)collectionView 
                  layout:(UICollectionViewLayout *)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath {

    [collectionView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)];
    return CGSizeMake(100, collectionView.frame.size.height);
}

सेल आकार को वापस करने से ठीक पहले सामग्री इनसेट सेट करना मेरे लिए ट्रिक था।

ध्यान दें:

मैं एक स्टोरीबोर्ड में एक कंटेनर दृश्य का उपयोग कर रहा हूं ताकि संग्रह दृश्य को UIViewController के भीतर लोड किया जा सके। मैंने स्टोरीबोर्ड में flowLayout ऑब्जेक्ट पर इसे सेट करने की कोशिश की। स्टोरीबोर्ड में संग्रह दृश्य। और UICollectionViewDelegateFlowLayout में से एक को ओवरराइड करना; हालांकि मुझे याद नहीं है कि कौन सा है। मुझे यकीन नहीं है कि यह एक ऊर्ध्वाधर लेआउट के लिए काम करेगा।


इसे इस्तेमाल करे...

UICollectionViewFlowLayout *layout = (id) self.collectionView.collectionViewLayout;

layout.itemSize = CGSizeMake(0.1, 0.1);

यह मेरे लिए काम करता है।


निम्नलिखित कोड ने मेरे लिए इसे निर्धारित किया:

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return self.collectionView.frame.size;
}

बस उसी समस्या का सामना किया और तय किया। चूंकि मेरा समाधान उन पंक्तियों के साथ अधिक है जो आप के लिए पूछ रहे थे और किसी भी मौजूदा उत्तर से मेल नहीं खाते, मैंने इसे यहां पोस्ट किया है।

#define NUMBER_OF_CELLS_PER_ROW 1

- (UICollectionViewFlowLayout *)flowLayout {
    return (UICollectionViewFlowLayout *)self.collectionViewLayout;
}

- (CGSize)itemSizeInCurrentOrientation {
    CGFloat windowWidth = self.collectionView.window.bounds.size.width;

    CGFloat width = (windowWidth - (self.flowLayout.minimumInteritemSpacing * (NUMBER_OF_CELLS_PER_ROW - 1)) - self.flowLayout.sectionInset.left - self.flowLayout.sectionInset.right)/NUMBER_OF_CELLS_PER_ROW;

    CGFloat height = 80.0f;

   return CGSizeMake(width, height);
}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    [self.flowLayout invalidateLayout];
    self.flowLayout.itemSize = [self itemSizeInCurrentOrientation];
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    // Now that the rotation is complete, load the cells.
    [self.collectionView reloadData];
}

बस चेतावनी को दबाने के लिए और (शायद, निश्चित नहीं) प्रदर्शन को बेहतर बनाने के लिए आप आकार में लौटने से पहले कर सकते हैं

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath

देखें कि क्या कंट्रोलर रोटेशन की प्रक्रिया में है और अगर यह CGSizeMake(0.1, 0.1) जैसे कुछ अपेक्षाकृत छोटे आकार में वापस आ रहा है


मुझे पता है कि यह एक पुराना सवाल है, लेकिन मुझे बस एक ही समस्या है और इसे हल करने में एक घंटा लगा। मेरी समस्या यह थी कि, ऐसा लगता है कि UICollectionView का फ्रेम आकार हमेशा गलत होता है (ऊंचाई कंटेनर से मेल नहीं खाती) जबकि मैंने UICollectionView प्रवाह लेआउट प्रतिनिधि को बुलाया जाने से ठीक पहले फ्रेम आकार निर्धारित किया है। इसलिए, मैंने UICollectionView फ्रेम का आकार फिर से विधि पर सेट किया:

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath

और यही चाल चली। ऊंचाई अब सही ढंग से दिख रही है और चेतावनी दूर हो गई है।


मुझे वही चेतावनी मिल रही थी। "पुनः लोडडता" दृष्टिकोण से असंतुष्ट, मैंने पाया कि संग्रह के फ्रेम को सेट करने से पहले [self.collectionView.collectionViewFlowLayout invalidateLayout] कॉल करने से चेतावनी को शांत कर दिया गया और अपेक्षित परिणाम मिले।


मेरा फिक्स आईबी में व्यू कंट्रोलर के लिए 'एडजस्ट स्क्रॉल व्यू इनसेट्स' को अनचेक करने जितना आसान था, क्योंकि मुझे ट्रांसलूसेंट होने के लिए अपने नेविगेशन बार की जरूरत थी।


मैंने इसी मुद्दे का सामना किया। यदि पोर्ट्रेट अभिविन्यास में संग्रह दृश्य प्रदर्शित किया गया था, तो परिदृश्य के लिए घुमाए जाने पर सेल गायब हो जाएंगे। मैंने इसे ठीक करने के लिए अन्य उत्तरों का संयोजन किया।

मैंने UIDeviceOrientationDidChangeNotification अधिसूचना प्राप्त करने के लिए अपना विचार (जिसमें UICollectionView शामिल है) UIDeviceOrientationDidChangeNotification । UICollectionView फ्रेम समायोजित होने के बाद, उस अधिसूचना का जवाब देने वाली विधि में, मैंने निम्नलिखित कार्य किया:

- (void)orientationChanged:(NSNotification *)notification
{
    CGSize size = (CGSize){self.frame.size.width - 2*kContentMargin, self.frame.size.height - 2*kContentMargin};
    [self.collectionView.collectionViewLayout setItemSize:size];

    [self.collectionView.collectionViewLayout invalidateLayout];
    [self.collectionView reloadData];
}

ध्यान दें कि UICollectionView का फ्रेम स्वचालित रूप से रोटेशन पर सेट किया जा रहा है, क्योंकि इसका आकार बदलने का कार्य प्रारंभिक अवस्था में इस पर सेट है:

self.collectionView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

मैंने उसी समस्या का सामना किया। यहाँ है कि मैं इसे कैसे हल किया। आशा करता हूँ की ये काम करेगा

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(    NSTimeInterval)duration
{
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];

    [self.collectionView reloadData];
}

मैंने एक UICollectionViewFlowLayoutInvalidationContext उपयोग किया है, जिसमें मैं नए ऑफसेट की गणना करता हूं, जैसे कि यह समान सामग्री ऑफसेट बनाए रखता है। मेरा अपना फ़ंक्शन संग्रहदृश्य आकार बदलें collectionViewSizeForOrientation: उचित आकार लौटाता है। यह सही नहीं है, लेकिन कम से कम यह स्केच नहीं है:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    CGSize fromCollectionViewSize = [self collectionViewSizeForOrientation:[self interfaceOrientation]];
    CGSize toCollectionViewSize = [self collectionViewSizeForOrientation:toInterfaceOrientation];

    CGFloat currentPage = [_collectionView contentOffset].x / [_collectionView bounds].size.width;
    NSInteger itemCount = [_collectionView numberOfItemsInSection:0];

    UICollectionViewFlowLayoutInvalidationContext *invalidationContext = [[UICollectionViewFlowLayoutInvalidationContext alloc] init];

    [invalidationContext setContentSizeAdjustment:CGSizeMake(toCollectionViewSize.width * itemCount - fromCollectionViewSize.width * itemCount, toCollectionViewSize.height - fromCollectionViewSize.height)];
    [invalidationContext setContentOffsetAdjustment:CGPointMake(currentPage * toCollectionViewSize.width - [_collectionView contentOffset].x, 0)];

    [[_collectionView collectionViewLayout] invalidateLayoutWithContext:invalidationContext];

    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
}

collectionViewSizeForOrientation: मेरे मामले में निम्नलिखित है, यह मानते हुए कि इनसेट और आइटम रिक्ति 0 हैं:

- (CGSize)collectionViewSizeForOrientation:(UIInterfaceOrientation)orientation
{
    CGSize screenSize = [[UIScreen mainScreen] bounds].size;

    CGFloat width = UIInterfaceOrientationIsLandscape(orientation) ? MAX(screenSize.width, screenSize.height) : MIN(screenSize.width, screenSize.height);
    CGFloat height = UIInterfaceOrientationIsLandscape(orientation) ? MIN(screenSize.width, screenSize.height) : MAX(screenSize.width, screenSize.height);

    return CGSizeMake(width, height);

}







uicollectionviewlayout