UIViewContentModeScaleAspectFill не обрезает

Я пытаюсь сделать несколько уменьшенных изображений с фиксированным размером (100x100) с помощью UIImageView. Я установил размер кадра моего изображения равным 100x100 и установил contentMode в UIViewContentModeScaleAspectFill.

Мое понимание заключается в том, что это должно привести к тому, что изображение будет нарисовано с установленным мной размером, и изображение заполнит область изображения и скопирует любые части изображения, которые находятся за пределами размера, установленного для представления изображения, Однако изображение по-прежнему нарисовано больше или меньше размера 100x100, который я установил для него.

Если я установил contentMode в UIviewContentModeScaleToFill, тогда изображение будет нарисовано ровно на 100x100, но оно искажено, чтобы вписаться в эти размеры. Любые идеи, почему заполнение аспект не обрезается, как ожидалось?

Здесь мой код:

_photoView = [[UIImageView alloc] initWithImage:photoImage];
_photoView.contentMode = UIViewContentModeScaleAspectFill;
[self addSubview:_photoView];

CGRect photoFrame = _photoView.frame;
photoFrame.size = CGSizeMake(100, 100);
_photoView.frame = photoFrame;

Чтобы лучше проиллюстрировать, вот скриншот того, что я вижу. Зеленые квадраты - это UIView, содержащие UIImageView, с которыми я работаю. Я установил цвет фона на зеленый, а рамка - на 100x100. В качестве теста размер UIImageViews равен 50x50. Как вы можете видеть, при использовании ...AspectFill изображения не имеют размер 50x50 и в некоторых случаях смещены от того места, где они мне нравятся. При использовании ...ScaleToFill они имеют правильную размерность, но изображение искажено.

Screenshot illustrating problem

Ответ 1

Можете ли вы настроить настройку клипа на рамки

[_photoview setClipsToBounds:YES];

Или прямо в своей раскадровке /Xib, если вы можете:

введите описание изображения здесь

Ответ 2

Если вы хотите расширить свои знания, есть действительно хорошая статья о том, как выглядит iOS UIView stack. Существует также более подробная статья о весь чертежный конвейер.

Вкратце:

  • Растеризация. Все содержимое представления растрируется (рисовано или внеэкранный буфер пикселей) в пространстве координат границ обзора. Это могут быть данные изображения или пользовательский чертеж (т.е. drawRect:), но субвью. Эта растеризация учитывает свойство contentMode.

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

  • Состав. Результаты компонуются (нарисованы друг над другом) из subview в superiews. В этом случае используется свойство frame подвэка.

    Если свойство clipsToBounds имеет значение YES в супервизии, то оно будет отбрасывать содержимое subview вне своих границ.

Ответ 3

имела ту же проблему, и это было разрешено, отметив "Подвижные клипы".

Изображение отображалось правильно для всех просмотров (3.5,4,4.7,5.5, ipad) в предварительном просмотре раскадровки, но не в симуляторе.

После того, как я пометил "Подвижные клипы", проблема была решена.:)

Ответ 4

Проверка "Подглядывание клипов" непосредственно в Storyboard/Xib также работала для меня. введите описание изображения здесь

Ответ 5

Мои подвалы менялись, и я понял, что это потому, что у xib был установлен автоматический макет: enter image description here

Ответ 6

Если все не удается,

сделать клипы привязанными к методу viewDidLayoutSubviews.

Пример:

  override func viewDidLayoutSubviews() {

    imageProfile.layer.cornerRadius = imageProfile.bounds.size.width/2
    imageProfile.clipsToBounds = true
    imageProfile.layer.masksToBounds = true
 }