2013-07-31 10 views
5

मेरे पास एक कस्टम UICollectionViewCell सबक्लास (MyCell) है, इसका इंटरफ़ेस ऑटो लेआउट का उपयोग कर इंटरफ़ेस बिल्डर में सेटअप है। सेल में एक छवि दृश्य और एक लेबल है।ऑटो लेआउट: UICollectionViewCell subViews के फ्रेम आकार को प्राप्त नहीं कर सकता

अब, जब मैं सेल को कॉन्फ़िगर करता हूं, तो मुझे छवि दृश्य की चौड़ाई और ऊंचाई जानने की आवश्यकता होती है। बहुत आसान लगता है, लेकिन ऐसा लगता है कि यह असंभव है।

मेरे विचार नियंत्रक में:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath]; 
    cell.itemNumber = indexPath.item; 
    return cell; 
} 

मेरे सेल उपवर्ग में मैं अपनी संपत्ति के सेटर उपयोग कर रहा हूँ सेल अनुकूलित करने के लिए:

- (void)setItemNumber:(NSInteger)itemNumber { 
    _itemNumber = itemNumber; 
    self.label.text = [NSString stringWithFormat:@"%i", self.itemNumber]; 

    // In my actual project I need to know the image view's width and hight to request an image 
    // of the right size from a server. Sadly, the frame is always {{0, 0}, {0, 0}} 
    // (same for the bounds) 
    NSLog(@"%@", NSStringFromCGRect(self.myImageView.frame)); 
} 

एक पूर्ण उदाहरण परियोजना https://github.com/kevinrenskers/CollectionViewAutoLayoutTest में पाया जा सकता।

तो समस्या यह है: मुझे छवि दृश्य के आकार को जानने की आवश्यकता है क्योंकि मुझे सही आकार की छवि उत्पन्न करने के लिए सर्वर से पूछने की आवश्यकता है। और छवि को देखने के आकार का होता है {0,0} ..

मैं -layoutSubviews विधि भी में अनुरूपण करने की कोशिश की है:

- (void)setItemNumber:(NSInteger)itemNumber { 
    _itemNumber = itemNumber; 
} 

- (void)layoutSubviews { 
    if (self.myImageView.frame.size.height) { 
     self.label.text = [NSString stringWithFormat:@"%i", self.itemNumber]; 
     NSLog(@"%@", NSStringFromCGRect(self.myImageView.frame)); 
    } 
} 

दुःख की बात है यह और भी अधिक में गड़बड़ है। विधि को दो बार कहा जाता है, पहले फ्रेम {{0, 0}, {0, 0}} है और फिर फ्रेम सही ढंग से सेट किया गया है। इस प्रकार यदि स्टेटमेंट ऊंचाई की जांच करता है। एक बार जब आप स्क्रॉल करना शुरू कर देते हैं, तो गलत लेबल गलत कोशिकाओं के लिए दिखाए जाते हैं। मुझे समझ में नहीं आता कि यहाँ क्या हो रहा है।

समस्या जब आप इसे example project में आज़माते हैं तो शायद अधिक समझ में आता है।

चौड़ाई और ऊंचाई की बाधाओं को सेट करना और इसे आईबीओटलेट बनाना एक अच्छा विकल्प की तरह लगता है, लेकिन दुख की बात है कि कोशिकाओं के पास निश्चित आकार नहीं है और छवि को सेल के साथ घटने और बढ़ने की आवश्यकता है। ऑटो लेआउट को हटाने का विकल्प एक विकल्प नहीं है।

+0

अपने कोड से परखने के बाद, आप ' अपने लेबल या अपनी छवि दृश्य शुरू नहीं कर रहे हैं। क्या यह सही है, या आपने इस उदाहरण प्रोजेक्ट के लिए उस कोड को छोड़ दिया है? – Maarten

+0

छवि दृश्य का आकार क्या निर्धारित करता है? – rdelmar

+0

मैं एक स्टोरीबोर्ड का उपयोग कर रहा हूं, यही वह छवि दृश्य और लेबल शुरू कर रहा है। आकार ऊपर, नीचे, बाएं और दाएं बाधाओं का उपयोग कर ऑटो लेआउट द्वारा निर्धारित किया जाता है। –

उत्तर

1

अंत में मैं, शीर्ष जोड़ा सही, नीचे और (superview करने के लिए) imageView पर रिक्ति की कमी छोड़ दिया है, उन्हें IBOutlets जोड़ा गया है और कुछ इस तरह इस्तेमाल किया:

CGFloat height = self.contentView.bounds.size.height - self.topConstraint.constant - self.bottomConstraint.constant; 
CGFloat width = self.contentView.bounds.size.width - self.leftConstraint.constant - self.rightConstraint.constant; 
संबंधित मुद्दे