2013-07-31 3 views
5

Ich habe eine benutzerdefinierte UICollectionViewCell-Unterklasse (MyCell), ihre Schnittstelle ist in Interface Builder mit Auto Layout eingerichtet. Die Zelle hat eine Bildansicht und eine Beschriftung.Auto-Layout: kann die Rahmengröße von UICollectionViewCell subViews nicht erhalten

Jetzt, wenn ich die Zelle konfiguriere, muss ich die Breite und die Höhe der Bildansicht kennen. Klingt ziemlich einfach, aber es sieht so aus, als ob es unmöglich ist.

In meiner Ansicht-Controller:

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

In meiner Zelle Unterklasse ich meine Unterkunft Setter bin mit der Zelle anpassen:

- (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)); 
} 

Ein komplettes Beispielprojekt finden Sie unter https://github.com/kevinrenskers/CollectionViewAutoLayoutTest finden.

Das Problem ist also: Ich muss die Größe der Bildansicht wissen, weil ich einen Server bitten muss, ein Bild der richtigen Größe zu generieren. Und die Größe der Bildansicht ist {0,0} ..

Ich habe versucht, auch das Customizing in der -layoutSubviews Methode zu tun:

- (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)); 
    } 
} 

Leider ist dies noch mehr durcheinander. Die Methode wird zweimal aufgerufen, zuerst ist der Rahmen {{0, 0}, {0, 0}} und dann wird der Rahmen korrekt gesetzt. Also die if-Anweisung, die nach der Höhe sucht. Sobald Sie mit dem Scrollen beginnen, werden die falschen Labels für die falschen Zellen angezeigt. Ich verstehe nicht, was hier vor sich geht. Das Problem macht wahrscheinlich mehr Sinn, wenn Sie es in der example project versuchen.

Das Festlegen von Breiten- und Höhenbeschränkungen und das Erstellen von IBOutlets scheint eine gute Option zu sein, aber leider haben die Zellen keine feste Größe und das Bild muss verkleinert werden und mit der Zelle wachsen. Das Entfernen des automatischen Layouts ist ebenfalls keine Option.

+0

aus dem Code zu urteilen, Sie‘ re initialisieren Sie Ihr Label oder Ihre imageView nicht. Ist das korrekt, oder haben Sie diesen Code für dieses Beispielprojekt einfach weggelassen? – Maarten

+0

Was bestimmt die Größe der Bildansicht? – rdelmar

+0

Ich benutze ein Storyboard, das ist die Initialisierung von ImageView und Label. Die Größe wird durch das automatische Layout unter Verwendung der oberen, unteren, linken und rechten Beschränkungen bestimmt. –

Antwort

1

Am Ende habe ich hinzugefügt oben, rechts, unten und auf dem Imageview Abstand Einschränkungen links (zum Superview), hinzugefügt IBOutlets ihnen und verwendet, um etwas wie folgt aus:

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;