У меня есть собственный подкласс UICollectionViewCell (MyCell
), его интерфейс настраивается в конструкторе интерфейсов с использованием автоматического макета. Ячейка имеет вид изображения и метку.
Теперь, когда я настраиваю ячейку, мне нужно знать ширину и высоту изображения. Звучит довольно просто, но похоже, что это невозможно.
В моем контроллере представления:
- (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}}, а затем кадр устанавливается правильно. Таким образом, оператор if, который проверяет высоту. Однако, как только вы начинаете прокручивать, неправильные метки отображаются для неправильных ячеек. Я не понимаю, что здесь происходит.
Проблема, вероятно, становится более понятной, если вы попробуете ее в примере проекта.
Установка ограничений по ширине и высоте и создание для них IBOutlets звучит как отличный вариант, но, к сожалению, ячейки не имеют фиксированного размера, и изображение должно уменьшаться и увеличиваться вместе с ячейкой. Удаление автоматического макета также не вариант.