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 Я работаю. Я установил их цвет фона на зеленый, а рамку вида на 100х100. В качестве теста UIImageViews имеют размер до 50x50. Как вы можете видеть, при использовании ...AspectFill, изображения не имеют размера 50x50, а в некоторых случаях смещены от того, где я хотел бы их. При использовании ...ScaleToFill, они имеют правильный размер, но изображение искажено.

6 139

6 ответов:

вы можете попробовать установить клип в границы

[_photoview setClipsToBounds:YES];

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

enter image description here

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

В итоге:

  1. Rasterisation - все содержимое вьюшки rasterised (нарисованный или внеэкранный буфер пикселей) в пространстве координат границ вида. Это могут быть данные изображения или пользовательский чертеж (т. е. drawRect:) но содержание подвида. Эта растеризация учитывает contentMode собственность.

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

  2. состав - результаты составляются (рисуются поверх друг друга) из подвида в супервизоры. При этом используется свойство frame подвида.

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

была та же проблема, и она была решена с помощью галочки "Clip Subviews".

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

после того, как я поставил галочку "клип Subviews" проблема была решена. :)

проверка "Clip subviews" непосредственно в раскадровке/Xib также работала для меня. enter image description here

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

Если все не получится,

сделать клипы к границам в методе viewDidLayoutSubviews.

пример :

  override func viewDidLayoutSubviews() {

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