Как объединить ограничения автоматического макета с свойством 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 (рамка в звездочках ниже), закругленные углы больше не видны:

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

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

Ответы

Ответ 1

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

Пример:

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

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

Ответ 2

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