Я пытаюсь нарисовать несколько миниатюр изображений фиксированного размера (100x100), используя UIImageView
. Я установил размер кадра моего изображения 100x100 и установил contentMode
в UIViewContentModeScaleAspectFill
.
Насколько я понимаю, это должно привести к тому, что изображение будет нарисовано в размере, который я установил, и изображение заполнит область изображения, и обрежет любые части изображения, которые не соответствуют размеру, который я установил для вида изображения. Тем не менее, изображение по-прежнему отображается больше или меньше размера, установленного для него размером 100x100.
Если я установил contentMode
на UIviewContentModeScaleToFill
, то изображение рисуется точно 100х100, но это искажено , чтобы вписаться в эти размеры. Любые идеи, почему заполнение аспекта не обрезается, как ожидалось?
Вот мой код:
_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
имеют размеры до 50х50. Как вы можете видеть, при использовании ...AspectFill
изображения размеры не 50x50, а в некоторых случаях смещены от того места, где я бы их хотел. При использовании ...ScaleToFill
они имеют правильный размер, но изображение искажено.
источник
Если вы хотите расширить свои знания, есть действительно хорошая статья о том, как визуализируется стек iOS UIView . Существует также более углубленная статья обо всем конвейере чертежей .
В итоге:
Растеризация - весь контент вида растеризуется (рисуется или закадровый пиксельный буфер) в координатном пространстве границ вида. Это могут быть данные изображения или пользовательский рисунок (то есть
drawRect:
), но содержимое подпредставления. Эта растеризация учитываетcontentMode
свойство.Все, что находится за пределами представления, отбрасывается.
Композиция - результаты составляются (рисуются друг на друга) от подпредставления до суперпредставлений. Это использует свойство frame подпредставления.
Если
clipsToBounds
свойствоYES
в суперпредставлении, оно будет отбрасывать содержимое подпредставления за его пределами.источник
была та же проблема, и она была решена, отметив «Клип Subviews».
Изображение показывалось правильно для всех видов (3.5,4,4.7,5.5, ipad) в режиме предварительного просмотра раскадровки, но не в симуляторе.
После того, как я поставил галочку "Клип Subviews", проблема была решена. :)
источник
Проверка «Клип подпредставлений» непосредственно в раскадровке / Xib также работала для меня.
источник
Мои подпредставления меняли размеры, и я понял, что это потому, что в xib был установлен автоматический макет:
источник
Если все не получается,
сделать клипы к границам в методе viewDidLayoutSubviews.
Пример :
источник