Ответ 1
Можете ли вы настроить настройку клипа на рамки
[_photoview setClipsToBounds:YES];
Или прямо в своей раскадровке /Xib, если вы можете:
Я пытаюсь сделать несколько уменьшенных изображений с фиксированным размером (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
они имеют правильную размерность, но изображение искажено.
Можете ли вы настроить настройку клипа на рамки
[_photoview setClipsToBounds:YES];
Или прямо в своей раскадровке /Xib, если вы можете:
Если вы хотите расширить свои знания, есть действительно хорошая статья о том, как выглядит iOS UIView stack. Существует также более подробная статья о весь чертежный конвейер.
Вкратце:
Растеризация. Все содержимое представления растрируется (рисовано или внеэкранный буфер пикселей) в пространстве координат границ обзора. Это могут быть данные изображения или пользовательский чертеж (т.е. drawRect:
), но субвью. Эта растеризация учитывает свойство contentMode
.
Все, что находится за пределами границ представлений, отбрасывается.
Состав. Результаты компонуются (нарисованы друг над другом) из subview в superiews. В этом случае используется свойство frame подвэка.
Если свойство clipsToBounds
имеет значение YES
в супервизии, то оно будет отбрасывать содержимое subview вне своих границ.
имела ту же проблему, и это было разрешено, отметив "Подвижные клипы".
Изображение отображалось правильно для всех просмотров (3.5,4,4.7,5.5, ipad) в предварительном просмотре раскадровки, но не в симуляторе.
После того, как я пометил "Подвижные клипы", проблема была решена.:)
Проверка "Подглядывание клипов" непосредственно в Storyboard/Xib также работала для меня.
Мои подвалы менялись, и я понял, что это потому, что у xib был установлен автоматический макет:
Если все не удается,
сделать клипы привязанными к методу viewDidLayoutSubviews.
Пример:
override func viewDidLayoutSubviews() {
imageProfile.layer.cornerRadius = imageProfile.bounds.size.width/2
imageProfile.clipsToBounds = true
imageProfile.layer.masksToBounds = true
}