2016-07-15 5 views
7

मेरे पास एक पृष्ठांकित, क्षैतिज स्क्रॉलिंग UICollectionView है जहां प्रत्येक सेल दृश्य/डिवाइस स्क्रीन का आकार लेता है, और एक समय में एक सेल दिखाई देता है। मुझे एक समस्या का सामना करना पड़ रहा है जहां डिवाइस रोटेशन पर, कोशिकाएं सही नए आकार में परिवर्तित हो जाएंगी, लेकिन कोशिकाओं की स्थिति बंद हो जाएगी।घूर्णन परिवर्तनों पर UICollectionViewCells का आकार बदलना वर्तमान में दृश्यमान कक्ष

रोटेशन से पहले:

Before Rotation

रोटेशन के बाद:

After Rotation

रोटेशन पर, मैं कैसे न केवल संग्रह दृश्य कोशिकाओं को ठीक से आकार बदलने लेकिन सुनिश्चित कर सकते हैं कि वर्तमान सेल दृश्यमान बनी रहती है ?

मैंने कस्टम समस्या लेआउट के बिना इस समस्या को एक बहुत ही सरल उदाहरण में उबाला है।

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 
    return collectionView.frame.size 
} 

viewWillLayoutSubviews में रोटेशन को संभालने के लिए प्रयास कर रहा है:

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 

    guard let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout else { return } 

    flowLayout.itemSize = collectionView.frame.size 

    flowLayout.invalidateLayout() 
} 

collectionView फ्रेम के आकार के हिसाब कोशिकाओं के आकार की स्थापना (संग्रह दृश्य यह धारण दृश्य नियंत्रक के आकार है)

असल में, अगर मैं पर viewWillLayoutSubviews पर कॉल करता हूं, तो itemSize सेट करना आवश्यक नहीं होना चाहिए, क्योंकि sizeForItemAtIndexPath को लेआउट पुनर्निर्मित होने पर कॉल किया जाएगा।

मैंने भी मैन्युअल रूप से नए itemSize सेट करने के बाद रोटेशन के दौरान पहली दिखाई सेल करने के लिए स्क्रॉल, लेकिन वह कोई सुधार से पता चलता करने की कोशिश की:

if let item = collectionView.indexPathsForVisibleItems().first { 
    collectionView.scrollToItemAtIndexPath(item, atScrollPosition: .CenteredHorizontally, animated: true) 
} 

उत्तर

7

आप सामग्री को संभालने चाहिए अपने UICollectionView की भरपाई करते हुए अपने दृश्य में तो नियंत्रक, UIContentContainer प्रोटोकॉल से viewWillTransitionToSize समारोह को ओवरराइड करने की कोशिश इस तरह:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) 

    let offset = yourCollectionView?.contentOffset; 
    let width = yourCollectionView?.bounds.size.width; 

    let index  = round(offset!.x/width!); 
    let newOffset = CGPointMake(index * size.width, offset!.y); 

    yourCollectionView?.setContentOffset(newOffset, animated: false) 

    coordinator.animateAlongsideTransition({ (context) in 
     yourCollectionView?.reloadData() 
     yourCollectionView?.setContentOffset(newOffset, animated: false) 
    }, completion: nil) 
} 
संबंधित मुद्दे