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 ответов:
если вы хотите расширить свои знания, есть очень хорошая статья о том, как стек iOS UIView отображается. Существует также более подробная статья о весь трубопровод чертежа.
В итоге:
Rasterisation - все содержимое вьюшки rasterised (нарисованный или внеэкранный буфер пикселей) в пространстве координат границ вида. Это могут быть данные изображения или пользовательский чертеж (т. е.
drawRect:
) но содержание подвида. Эта растеризация учитываетcontentMode
собственность.все, что выходит за пределы представления отбрасывается.
состав - результаты составляются (рисуются поверх друг друга) из подвида в супервизоры. При этом используется свойство frame подвида.
если
clipsToBounds
недвижимостьYES
на супервизор, то он будет отбрасывать subview содержание вне его границы.