Как объединить ограничения автоматического макета с свойством 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
.