2013-07-31 11 views
5

Mam niestandardową podklasę UICollectionViewCell (MyCell), jej interfejs jest ustawiony w Interface Builder za pomocą Auto Layout. Komórka ma widok obrazu i etykietę.Auto Layout: nie można uzyskać rozmiaru ramki UICollectionViewCell subViews

Teraz, gdy konfiguruję komórkę, muszę znać szerokość i wysokość widoku obrazu. Brzmi dość prosto, ale wygląda na to, że to niemożliwe.

moim zdaniem kontrolera:

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

W moim podklasy komórek Używam setter moja własność, aby dostosować komórkę:

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

Pełną przykładem projektu można znaleźć na stronie https://github.com/kevinrenskers/CollectionViewAutoLayoutTest.

Problem polega na tym, że muszę znać rozmiar widoku obrazu, ponieważ muszę poprosić serwer o wygenerowanie obrazu o odpowiednim rozmiarze. I wielkość widoku obrazu jest {0,0} ..

Próbowałem zrobić dostosowywania w metodzie -layoutSubviews TOO:

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

Niestety, jest to nawet bardziej pomieszane. Metoda jest wywoływana dwa razy, najpierw ramka to {{0, 0}, {0, 0}}, a następnie ramka jest ustawiona poprawnie. Tak więc instrukcja if sprawdzająca wysokość. Po rozpoczęciu przewijania wyświetlane są złe etykiety dla niewłaściwych komórek. Nie rozumiem, co się tutaj dzieje.

Problem prawdopodobnie ma więcej sensu, gdy próbujesz go w urządzeniu example project.

Ustawienie ograniczeń szerokości i wysokości oraz tworzenie IBOutletów brzmi jak świetna opcja, ale niestety komórki nie mają ustalonego rozmiaru, a obraz musi się kurczyć i rosnąć wraz z komórką. Usunięcie automatycznego układu nie jest również opcją.

+0

sądząc po kodzie, ty” nie inicjalizuj etykiety ani obrazu. Czy to prawda, czy po prostu pominąłeś ten kod dla tego przykładowego projektu? – Maarten

+0

Co decyduje o wielkości widoku obrazu? – rdelmar

+0

Używam scenorysu, to właśnie inicjuje imageView i etykietę. Rozmiar jest określany przez Automatyczny układ, stosując ograniczenia górny, dolny, lewy i prawy. –

Odpowiedz

1

W końcu dodałem górny, prawy i dolny i lewy odstępów ograniczenia na ImageView (do SuperView), dodaje IBOutlets do nich i stosować coś takiego:

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; 
Powiązane problemy