2015-11-27 8 views
7

मैं गतिशील रूप से UICollectionView की सामग्री को केंद्रित करने की कोशिश कर रहा हूं, हालांकि मौजूदा समाधानों में से कोई भी इस तथ्य को ध्यान में रखता है कि प्रति पंक्ति एक से अधिक सेल हो सकते हैं।लंबवत रूप से UICollectionView सामग्री को कैसे नियंत्रित करें

मैंने इस center custom title in UINavigationBar? के साथ-साथ दोनों समाधानों को आजमाया है: UICollectionView vertically Centred, इसका कोई फायदा नहीं हुआ।

मुझे आश्चर्य है कि आईओएस डिफ़ॉल्ट रूप से ऐसा करने का कोई तरीका नहीं प्रदान करता है और इससे भी अधिक है कि वर्तमान में प्रदर्शित होने वाली पंक्तियों की संख्या प्राप्त करना संभव नहीं है (जो मेरी समस्या को भी हल कर लेगा)। इसके अलावा, मुझे सामग्री का आकार नहीं मिल सकता है (और न केवल फ्रेम का आकार) जो मुझे वांछित प्रभाव प्राप्त करने में भी मदद करेगा।

मैं इस है:

-------- 
|X X X X | 
|X X X X | 
|  | 
|  | 
-------- 

लेकिन मैं यह चाहता हूँ:

-------- 
|  | 
|X X X X | 
|X X X X | 
|  | 
-------- 

किसी भी मदद की बहुत सराहना की जाएगी,

बहुत धन्यवाद।

+1

मैं आपकी समस्या को समझ में नहीं आता। और पंक्तियों की संख्या "पाने" के तरीके से आपका क्या मतलब है? आप संग्रह को आइटम, उनके आकार इत्यादि की संख्या को देखते हैं ... – Darko

+0

@ डार्को: कोशिकाओं के समूह को केंद्रित करने के लिए मुझे यह जानने में सक्षम होना चाहिए कि संग्रह दृश्य कितनी पंक्तियां प्रदर्शित हो रहा है (जो कि इससे अलग है स्क्रीन आकार के आधार पर, आइटमों की संख्या पंक्ति में प्रदर्शित की जा सकती है)। एक बार मेरे पास कोशिकाओं की संख्या हो जाने के बाद मैं शीर्ष इन्सेट (संग्रहदृश्य फ्रेम ऊंचाई - कोशिकाओं द्वारा कब्जा कर लिया गया कुल ऊंचाई)/2 सेट कर सकता हूं।मैंने अपने प्रश्न के लिए एक दृश्य प्रस्तुतिकरण जोड़ा है। –

+0

आपके दृश्य प्रतिनिधित्व के संबंध में - यदि आप संस्करण 2 चाहते हैं, तो आप संग्रह को इतना बड़ा क्यों बनाते हैं? ऑटो लेआउट के साथ बस इसे छोटा करें और इसे स्क्रीन में केंद्रित करें। इसके अलावा (जैसा कि जोर्फ पहले से ही उत्तर दिया गया है) आप सेक्शन इंसेट सेट कर सकते हैं। लेकिन मेरी राय में इन्सेट केवल तभी उपयोगी होते हैं जब आप रनटाइम के दौरान इसे बदलना चाहते हैं। यदि लेआउट तय किया गया है तो संग्रह को छोटा बनाएं। – Darko

उत्तर

3

अब मैं आपकी समस्या को समझता हूं। स्क्रीन आकार के आधार पर आपको इसे केंद्रित करने के लिए एक और इंसेट चाहिए। फिर आपको इसे मैन्युअल रूप से गणना करना होगा, लेकिन यह मुश्किल नहीं होना चाहिए। आप उपलब्ध स्थान, वस्तुओं की संख्या और सेल आकार जानते हैं। बस शीर्ष से अनुभाग इन्सेट की गणना करें।

0

UICollectionView में visibleCells संपत्ति है जो एक सरणी लौटाती है। दृश्यमान कक्षों की संख्या प्राप्त करने के लिए आप NSArray पर count संपत्ति का उपयोग कर सकते हैं।

आप अपने प्रतिनिधि कार्यान्वयन में - collectionView:layout:insetForSectionAtIndex: को लागू करने में सक्षम होना चाहिए ताकि वह उस शीर्ष पर इन्सेट सेट कर सके जिसके लिए आप शूटिंग कर रहे हैं।

आप UICollectionViewFlowLayout उपखंड भी कर सकते हैं और यदि आवश्यक हो तो अपना खुद का लेआउट तर्क लागू कर सकते हैं।

+0

सबक्लासिंग के बिना ऐसा करने का एकमात्र व्यवहार्य तरीका लगता है, डार्को को मेरी दूसरी टिप्पणी देखें कि यह एक व्यवहार्य समाधान क्यों नहीं है। यह मानता है कि स्क्रीन के आकार के हर पंक्ति के लिए मेरे पास समान मात्रा में कक्ष हैं। हालांकि सभी कोशिकाएं दिखाई दे रही हैं, फिर भी वे पंक्तियों के निरंतर सेट पर प्रदर्शित नहीं होंगे। –

10

सुनिश्चित नहीं है कि आप सामग्री का आकार क्यों प्राप्त नहीं कर सकते - UICollectionViewUIScrollView सबक्लास है, इसलिए contentSize संपत्ति तक पहुंच है। आप केवल मामले में कोशिकाओं को केंद्र में रखने की जरूरत है कि वे सभी स्क्रॉल किए बिना देखा हैं, तो आप बस निम्न कर सकते हैं:

collectionView.contentInset.top = max((collectionView.frame.height - collectionView.contentSize.height)/2, 0) 

यह भी मामलों में काम करेंगे जब कोशिकाओं की संख्या इतनी है कि उन सभी को नहीं कर रहे हैं बढ़ता है स्क्रीन पर दिखाई दे रहा है और आप लंबवत स्क्रॉलिंग का उपयोग शुरू करते हैं - शीर्ष इन्सेट 0 पर सेट किया जाएगा।

0

आप एक tabBar है, तो इस

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { 

    let navBarHeight  = self.navigationController?.navigationBar.frame.height 
    let collectionViewHeight = (self.collectionView?.frame.height)! - navBarHeight! 
    let itemsHeight  = self.collectionView?.contentSize.height 

    let topInset = (collectionViewHeight - itemsHeight!)/4 

    return UIEdgeInsetsMake(topInset ,0, 0 , 0) 
} 

करते हैं tabBar घटाव को नजरअंदाज नहीं है और बाकी को छोड़ ...

संबंधित मुद्दे