2015-12-16 6 views
5

मैं यूआईसीओलेक्शन व्यू में सेल्स की ऊंचाई को कैसे सेट करना चाहता हूं, जो संग्रह दृश्य की ऊंचाई के बराबर है? नीचे दिया गया कोड काम नहीं करता है क्योंकि संग्रह दृश्य ऊंचाई इस बिंदु पर ज्ञात नहीं है क्योंकि ऐसा लगता है क्योंकि ऑटो लेआउट इस चरण में गुणों के साथ गड़बड़ कर रहा है। यह कोशिकाओं की ऊंचाई वास्तविक संग्रह दृश्य से अधिक होने का कारण बनता है।यूआईसीओलेक्शन व्यूसेल और यूआईसीओलेक्शन व्यू की समान ऊंचाई

मैं इस जवाब को हल करने के लिए 300 में बाउंटी में जोड़ दूंगा!

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 

     return CGSize(width: 100, height: collectionView.frame.size.height) 
    } 

2015-12-16 18: 43: 53.643 मेरे एप्लिकेशन के अंतर्गत [1055: 434,762] के व्यवहार में प्रवेश क्योंकि कोड hereUICollectionViewFlowLayout परिभाषित नहीं है: 2015/12/16 18: 43: 53.643 माई-ऐप [1055: 434762] आइटम की ऊंचाई की तुलना में कम होनी चाहिए UICollectionView से कम से कम अनुभाग नीचे और नीचे मानों को कम करता है, सामग्री को शीर्ष और नीचे मानों को कम करता है। 2015-12-16 18: 43: 53.643 माई ऐप [1055: 434762] कृपया प्रतिनिधि द्वारा मूल्यों की जांच करें। 2015-12-16 18: 43: 53.644 मेरा ऐप [1055: 434762] प्रासंगिक UICollectionViewFlowLayout उदाहरण है, और यह संलग्न है; परत =; सामग्री ऑफ़सेट: {0, 0}; सामग्री आकार: {3087, 307}> संग्रह दृश्य लेआउट:। 2015-12-16 18: 43: 53.644 मेरा ऐप [1055: 434762] पर एक प्रतीकात्मक ब्रेकपॉइंट बनाएं डीबगर में इसे पकड़ने के लिए UICollectionViewFlowLayoutBreakForInvalidSizes पर।

समाधान जो हैनड्स सुझाव के आधार पर काम करता है। यदि बेहतर तरीके हैं तो कृपया मुझे बताएं

एक संपत्ति पर्यवेक्षक के साथ एक संपत्ति बनाई।

var myCollectionViewHeight: CGFloat = 0.0 { 
    didSet { 
     if myCollectionViewHeight != oldValue { 
      myCollectionView.collectionViewLayout.invalidateLayout() 
      myCollectionView.collectionViewLayout.prepareLayout() 
     } 
    } 
} 

अवहेलना इस विधि (यह कहा जाता है कई बार)

override func viewDidLayoutSubviews() { 
    myCollectionViewHeight = myCollectionView.bounds.size.height 
} 

तब मैं अपने प्रतिनिधि में यह है:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {    
      return CGSize(width: 100, height: myCollectionViewHeight) 
    } 

उत्तर

6

यहां यह है कि मैं इसे कैसे करूँगा। सबसे पहले दृश्य नियंत्रक में एक वैश्विक चर जोड़ें जो संग्रह दृश्य की ऊंचाई को संग्रहीत करने के लिए उपयोग किया जाएगा। viewDidLayoutSubviews विधि में, collectionView की ऊंचाई को यह चर सेट, और अगर यह बदल गया है, UICollectionView लेआउट

collectionView.collectionViewLayout.invalidateLayout() 

कौन सा collectionView कोशिकाओं के आकार निर्धारित करने के लिए विधि कॉल करेंगे रद्द करने के लिए एक विधि कहते हैं, और में उस विधि, सेल की ऊंचाई को ग्लोबल वैरिएबल में संग्रह दृश्य की ऊंचाई रखते हुए सेट करें।

नोट: वर्तमान में मेरे मोबाइल पर और इस कोड का परीक्षण नहीं किया। मैंने कुछ याद किया होगा।

+0

यह काम करने से बहुत दूर नहीं है। मैं अपने प्रश्न को पूर्ण उत्तर से अपडेट कर दूंगा। – LuckyLuke

+0

ध्यान दें कि यह शुरुआत में एक बार संग्रह दृश्य को लेआउट करेगा, और एक बार लेआउट को अमान्य करने के बाद। सबसे कुशल समाधान नहीं है, लेकिन मुझे पता है कि एक। आपके अपडेट की प्रतीक्षा कर रहे हैं। – hannad

+0

@ लकी ल्यूक आपने उल्लेख किया कि 'viewDidLayoutSubviews' को कई बार कहा जाता है। मुझे लगता है कि 'didSet' को हर बार' myCollectionViewHeight' सेट किया जाता है, भले ही यह वही मान हो। क्या आप यह निर्धारित करने के लिए 'myCollectionViewHeight'' myCollectionView.bounds.size.height' के बराबर नहीं है, यह जांचने के लिए कोई कथन जोड़ सकता है? इससे मदद मिल सकती है। – hannad

6

आप अपने viewDidLoad लिए इस कोड को सेट करने का प्रयास करें:

self.automaticallyAdjustsScrollViewInsets = false 

एच इस मदद करो!

+0

स्टोरीबोर्ड में इस संपत्ति को सेट करना ऑफसेट के साथ भी मदद करता है। अन्यथा जब आप इसे UINavigationController में डालते हैं तो कोई UICollectionView नीचे धकेल दिया जाता है। "स्क्रॉल व्यू इन्सेट समायोजित करें" अनचेक करें –

0

मैं इस मुद्दे में भी भाग गया और मैं प्रासंगिक sectionInsets घटाकर इसे हल करने में सक्षम था। एक बार जब आप .size.height संपत्ति में नहीं मानते हैं, तो वे ऊंचाई को स्वीकार करते हैं।

sizeForItemAtIndexPath आप अनुभाग इनसेट आयाम घटाना करने की जरूरत है अंदर ...

let sectionInset = self.collectionView?.collectionViewLayout.sectionInset 
    let heightToSubtract = sectionInset!.top + sectionInset!.bottom 

    return CGSize(width: 100.0, height: (self.collectionView?.bounds.height)! - heightToSubtract) 

नोट: मैं यहाँ optionals unwrapping मजबूर लेकिन सुरक्षित रहने के लिए आप उन्हें

+0

लेकिन बात यह है कि मैंने प्रतिनिधियों के तरीकों के साथ 0 को इन्सेट सेट कर दिया है। यह तब necassary नहीं होना चाहिए। – LuckyLuke

+0

@LuckyLuke मुझे लगता है कि आपके पास सामग्री इन्सेट सेट 0 पर भी है? और आपने इन मानों को मुद्रित किया है और पुष्टि कर सकते हैं कि सबकुछ 0 है? मुझे तब पता नहीं है, क्योंकि कुछ आपकी ऊंचाई को कलेक्शनव्यू.बॉउंड्स की तुलना में अधिक होने के बारे में बता रहा है। प्रोजेक्ट को देखे बिना बताए जाने के लिए कठिन और कठिन है – bolnad

0

मैं इस किया था जांच करना चाह सकते कर रहा हूँ मुद्दा क्योंकि मैंने के नीचे को ऊंचाई प्रदान किए बिना UICollectionView पिन किया था।

कुछ नेटवर्क अनुरोध करने के बाद और [self.tableView reloadData] को UIViewController पर कॉल करने के बाद, मुझे लॉग में एक ही त्रुटि संदेश मिला।

मैंने नीचे की बाधा को तोड़कर और UICollectionView को एक निश्चित ऊंचाई देकर इसे हल करने में कामयाब रहे।

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