Автоматический макет: не удается получить размер кадра подвидов UICollectionViewCell.

У меня есть собственный подкласс 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 звучит как отличный вариант, но, к сожалению, ячейки не имеют фиксированного размера, и изображение должно уменьшаться и увеличиваться вместе с ячейкой. Удаление автоматического макета также не вариант.


person Kevin Renskers    schedule 31.07.2013    source источник
comment
Судя по вашему коду, вы не инициализируете свою метку или свой imageView. Это правильно, или вы просто пропустили этот код для этого примера проекта?   -  person Maarten    schedule 31.07.2013
comment
От чего зависит размер изображения?   -  person rdelmar    schedule 31.07.2013
comment
Я использую раскадровку, это то, что инициализирует imageView и метку. Размер определяется автоматическим макетом с использованием ограничений сверху, снизу, слева и справа.   -  person Kevin Renskers    schedule 31.07.2013


Ответы (1)


В конце концов я добавил верхние, правые, нижние и левые ограничения интервалов в изображении (в суперпредставлении), добавил к ним 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;
person Kevin Renskers    schedule 06.08.2013