У меня есть UITableView
с динамической высотой UITableViewCell
, и я использую автоматический макет для вычисления высот по этому отличному ответу по этой теме. Пока все хорошо.
Я адаптирую приложение для работы с более крупными размерами экрана iPhone (6 и 6 Plus), и это в основном довольно просто.
Однако в некоторых моих ячейках у меня есть изображение, которое я хочу охватить всю ширину ячейки, и я хочу, чтобы высота изображения была пропорциональна ширине изображения (0,55 * ширина, чтобы быть конкретным). До сих пор у меня была ширина и высота изображения, жестко закодированные в ограничениях автоматической компоновки, в зависимости от стандартной высоты стола для настольного стола 320 пикселей, до iPhone 6/6 Plus.
Я думал, что было бы просто добавить относительное ограничение высоты, подобное этому (я использую PureLayout):
[self.myImage autoMatchDimension:ALDimensionHeight
toDimension:ALDimensionWidth
ofView:self
withMultiplier:0.55f
relation:NSLayoutRelationGreaterThanOrEqual];
Если вы не знакомы с PureLayout, это переводит на вызов
[NSLayoutConstraint constraintWithItem: attribute: relatedBy: toItem: attribute: multiplier: constant:0.0f]
Существуют и другие ограничения, которые привязывают его к супервину, который является UITableViewCell
contentView.
Однако, когда я вызываю systemLayoutSizeFittingSize:
в ячейке contentView, он, похоже, полностью игнорирует относительное ограничение по высоте, а результирующая высота ячейки слишком мала, чтобы соответствовать изображению.
Если я устанавливаю явное ограничение по высоте вместо относительного, нет проблем. Аналогично, если я подклассом UIImageView
и возвращаю явный размер в intrinsicContentSize
, проблем нет.
Я даже попробовал следующее в подклассе UIImageView
:
- (void) layoutSubviews {
[super layoutSubviews];
self.intrinsicSizeForAutolayout = self.frame.size;
[super layoutSubviews];
}
- (CGSize)intrinsicContentSize {
return self.intrinsicSizeForAutolayout;
}
где intrinsicSizeForAutolayout - свойство, которое я определил для этой цели. Я думал, что это может работать аналогично тому, как настройка preferredMaxLayoutWidth
для UILabel
решает аналогичную проблему.
Но нет. Это не работает.
Казалось бы, у меня есть небольшая альтернатива использовать уродливый код проверки ширины экрана, чтобы условно установить фиксированное ограничение высоты в зависимости от ширины экрана, чего я действительно хотел избежать, так как это как бы побеждает цель использования автоматической компоновки в первое место.