Хобрук: Ваш путь к мастерству в программировании

Как я могу рассчитать размер UICollectionViewCell, загруженного из xib с ограничениями соотношения сторон автомакета?

У меня есть UICollectionViewCell, который загружается из xib и хранится в свойстве, чтобы помочь с вычислением размеров ячеек для моего представления коллекции. Представление коллекции всегда имеет только один столбец, поэтому ширина ячеек зависит от телефона пользователя (iphone 5/6/6+). Xib имеет представление изображения с соотношением сторон, которое должно оставаться постоянным для всех размеров телефонов.

Проблема, с которой я сталкиваюсь, связана с этой конфигурацией. Кажется, я не могу сделать размер ячейки таким, каким хочу, на основе фиксированной ширины. Мой метод sizeForItemAtIndexPath: выглядит так:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    self.sizingCell.frame.size.width = self.flowLayout.fullViewSectionSize.width;
    [self configureCell:self.sizingCell atIndexPath:indexPath];
    [self.sizingCell setNeedsLayout];
    [self.sizingCell layoutIfNeeded];
    CGSize size = [self.sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
    return size;
}

Я делаю то, что я читал, я должен для расчетов динамического размера с ячейкой за пределами экрана, но проблема в том, что когда вызывается layoutIfNeeded, я получаю исключение неудовлетворительного ограничения с моими ограничениями и дополнительным ограничением, которое устанавливает высота ячейки должна быть ее высотой, как определено в xib. Система никогда не нарушает это дополнительное ограничение по высоте, которое я не добавлял, поэтому высота ячейки всегда является неправильной высотой представления во время разработки в xib.

Могу ли я как-то удалить это постороннее ограничение, из-за которого это не работает? Есть ли здесь какой-то другой параметр, который делает то, что мне нужно? Я также пытался отключить translatesAutoResizingMaskIntoConstraints безрезультатно. Как я могу заставить ячейку, загруженную xib, определить ее размер на основе ограничений, связанных с соотношением сторон?

Изменить:

Если вы хотите увидеть, о чем я говорю в действии, я собрал быструю версию этого в репозитории github здесь: https://github.com/klundberg/Autolayout-CollectionViewExample


Ответы:


1

Я понял это с помощью небольшого обходного пути.

Первоначально мой xib был ячейкой представления коллекции, в которой подпредставление было изображением с ограничением соотношения сторон. Это противоречило ограничениям по умолчанию, которые iOS добавляет к этим ячейкам (с именем «UIView-Encapsulated-Layout-Height/Width»). Мое решение состояло в том, чтобы ввести один уровень представления между ячейкой и представлениями, о которых я заботился, так что теперь это ячейка, содержащая представление контейнера, которое содержит мое представление изображения. Контейнерное представление не получает применяемых к нему ограничений инкапсулированного макета, поэтому, если я создам для него IBOutlet и вызову systemLayoutSizeFittingSize: для этого представления (вместо contentView после установки его ширины, он будет правильно вычислять высоту без конфликтов ограничений.

10.05.2015
Новые материалы

Решения DBA Metrix
DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

Начало работы с Блум
Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...