Как объединить ограничения Auto Layout со свойством contentMode в UIView

У меня есть UIImageView Объект настроен с помощью Auto Layout. Я создал ограничения, чтобы вид оставался на постоянном расстоянии от своего суперпредставления. В визуальном формате это будет выглядеть так:

@"V:|-[imageView]-|"
@"H:|-[imageView]-|"

Но я также хотел бы сохранить соотношение сторон основного изображения, поэтому я назначил UIViewContentModeScaleAspectFit в contentMode,

Я думал, что все работает хорошо, пока я не установил cornerRadius стоимость ассоциированного CALayer:

self.imageView.layer.cornerRadius = 7;
self.imageView.layer.maskToBounds = YES;

Теперь, когда размер изображения изменяется, например, из-за изменения ориентации, закругленные углы теряются в зависимости от нового размера, который получает вид. Причина в том, что cornerRadius относится к UIImageView (рамка в тире ниже), но так как базовое изображение также изменено в соответствии с contentMode (рамка в звездочках ниже), закругленные углы больше не видны:

--------------------------
|       **********       |
|       *        *       |
|       *        *       |
|       *        *       |
|       **********       |
--------------------------

Есть ли способ предотвратить такое поведение?

2 ответа

Как сказал @jacob-k, вы должны добавить в свой подкласс ячейки layoutSubviews, но просто чтобы добавить вам нужно позвонить layoutIfNeeded первый.

Пример:

- (void)layoutSubviews
{
  [super layoutSubviews];
  [self layoutIfNeeded];
  imageView.layer.cornerRadius = imageView.frame.size.width / 2;
}

Если ты не будешь звонить layoutIfNeeded Сначала применяются все изменения без установленных ограничений.

Одним из быстрых способов сделать это может быть создание подкласса UIImageView и установка углового радиуса в layoutSubviews,

Другие вопросы по тегам