ios - विभिन्न डिवाइस ओरिएंटेशन पर UICollectionViewCell आकार बदलें




(4)

मैं UICollectionView साथ एक UICollectionView का उपयोग कर रहा हूँ।

मैंने प्रत्येक सेल का आकार सेट किया है

collectionView:layout:sizeForItemAtIndexPath:

पोर्ट्रेट से लैंडस्केप में स्विच करते समय, मैं संग्रह कक्ष के आकार को पूरी तरह फिट करने के लिए प्रत्येक सेल के आकार को समायोजित करना चाहता हूं, बिना कोशिकाओं के बीच पैडिंग स्थान छोड़े।

प्रशन:

1) घूर्णन घटना के बाद सेल के आकार को कैसे बदला जाए?

2) और, इससे भी बेहतर, लेआउट कैसे बनाना है जहां कक्ष हमेशा स्क्रीन के पूरे आकार में फिट होते हैं?


1) आप कई लेआउट ऑब्जेक्ट्स को बनाए रख सकते हैं और स्वैप कर सकते हैं, लेकिन एक आसान तरीका है। बस अपने UICollectionViewController उप UICollectionViewController में निम्नलिखित जोड़ें और आवश्यकतानुसार आकार समायोजित करें:

- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout *)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{    
    // Adjust cell size for orientation
    if (UIDeviceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) {
        return CGSizeMake(170.f, 170.f);
    }
    return CGSizeMake(192.f, 192.f);
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    [self.collectionView performBatchUpdates:nil completion:nil];
}

कॉलिंग -performBatchUpdates:completion: लेआउट को अमान्य कर देगा और एनीमेशन के साथ कोशिकाओं का आकार बदल देगा (यदि आपके पास प्रदर्शन करने के लिए कोई अतिरिक्त समायोजन नहीं है तो आप केवल ब्लॉक पैराम दोनों को शून्य पास कर सकते हैं)।

2) आइटम आकारों को हार्डकोड करने के बजाय -collectionView:layout:sizeForItemAtIndexPath , बस संग्रह की ऊंचाई या चौड़ाई को विभाजित करें -collectionView:layout:sizeForItemAtIndexPath की संख्या से आप स्क्रीन पर फिट होना चाहते हैं। यदि आपका संग्रह दृश्य क्षैतिज या चौड़ाई स्क्रॉल करता है तो ऊंचाई का उपयोग करें यदि यह लंबवत स्क्रॉल करता है।


मैंने दो UICollectionViewFlowLayout का उपयोग करके हल किया। एक चित्र के लिए और एक परिदृश्य के लिए। मैं उन्हें अपने संग्रह में असाइन करता हूं दृश्यमान रूप से इन -viewDidLoad देखें

self.portraitLayout = [[UICollectionViewFlowLayout alloc] init];
self.landscapeLayout = [[UICollectionViewFlowLayout alloc] init];

UIInterfaceOrientation orientationOnLunch = [[UIApplication sharedApplication] statusBarOrientation];

if (UIInterfaceOrientationIsPortrait(orientationOnLunch)) {
    [self.menuCollectionView setCollectionViewLayout:self.portraitLayout];
} else {
    [self.menuCollectionView setCollectionViewLayout:self.landscapeLayout];
}

तब मैंने बस इस तरह अपने संग्रह ViewFlowLayoutDelgate विधियों को संशोधित किया

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
    CGSize returnSize = CGSizeZero;

    if (collectionViewLayout == self.portraitLayout) {
        returnSize = CGSizeMake(230.0, 120.0);
    } else {
        returnSize = CGSizeMake(315.0, 120.0);
    }

    return returnSize;
}

आखिरकार मैं एक लेआउट से घूर्णन पर एक दूसरे से स्विच करता हूं

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
    if (UIInterfaceOrientationIsPortrait(fromInterfaceOrientation)) {
        [self.menuCollectionView setCollectionViewLayout:self.landscapeLayout animated:YES];
    } else {
        [self.menuCollectionView setCollectionViewLayout:self.portraitLayout animated:YES];
    }
}

यदि आप performBatchUpdates:completion: द्वारा लाए गए अतिरिक्त एनिमेशन नहीं चाहते हैं performBatchUpdates:completion: संग्रह को देखने के लिए संग्रह performBatchUpdates:completion: को लागू invalidateLayout लिए केवल performBatchUpdates:completion: उपयोग करें।

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    [self.collectionView.collectionViewLayout invalidateLayout];
}

संग्रह दृश्य सेल आकार सेट करने का एक आसान तरीका है:

UICollectionViewFlowLayout *layout = (id) self.collectionView.collectionViewLayout;
layout.itemSize = CGSizeMake(cellSize, cellSize);

यकीन नहीं है कि यह एनिमेटेबल है हालांकि।





uicollectionviewcell