UIViewContentModeScaleAspectFill не відсікається


144

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

Знімок екрана, що ілюструє проблему

Відповіді:


352

Чи можете ви спробувати встановити кліп на межі

[_photoview setClipsToBounds:YES];

Або безпосередньо у вашій сторінці розкадри / Xib, якщо можете:

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


10
Це було все - спасибі. (Я додав знімок екрана вище, щоб краще показати те, що я бачив, більше як приклад, якщо хтось інший стикається з цією проблемою.)
Джош Балер

3
У InterfaceBuilder, перейменований (безпомилково) на "Кліп субпрезентації" (Примітка: у цьому випадку він не відшаровує "підперегляди", назва неправильна: вона відсікає САМО І ПІДПРИЄМСТВА)
Адам,

3
Позначте параметр "Кліп підзаписів" у файлі NIB те саме. Ура.
codeburn

А як бути, якщо ви хочете додати тінь за допомогою властивості CALayer :( додавання іншого виду позаду для мене не ідеально
Rambatino

Якщо ви використовуєте автоматичний макет, як я, є ще одна можлива причина - NSLayoutConstraint "UIView-Encapsulated-Layout-Height", що порушує обмеження розміру UIImageView.
ewiinnnnn

8

Якщо ви хочете розширити свої знання, є справді хороша стаття про те, як відображається стек iOS UIView . Існує також більш поглиблена стаття про весь креслення трубопроводу .

Підсумовуючи:

  1. Растеризація - весь вміст перегляду растеризується (намальований або позаекранний піксельний буфер) у координатному просторі меж перегляду. Це можуть бути зображення зображень або користувацький малюнок (тобто drawRect:), але вміст субпрогляду. Ця растеризація враховує contentModeвластивість.

    Все, що знаходиться поза межами перегляду, викидається.

  2. Композиція - результати складаються (складені один на одного) від підпогляду до перегляду. Для цього використовується властивість фрейму в підпогляді.

    Якщо clipsToBoundsвластивість YESпереглянуто, вона відкине вміст підзагляду поза його межами.


2

мала таку ж проблему, і вона була вирішена, позначивши "Subviews Clip".

Зображення відображалося належним чином для всіх переглядів (3,5,4,4,7,5,5, ipad) у попередньому попередньому перегляді, але не в тренажері.

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


1

Перевірка "Кліп підпоказів" безпосередньо в "Розгортці" / Xib також працювала для мене. введіть тут опис зображення


0

Мої підгляди змінювали розмір, і я зрозумів, що це тому, що в xib встановлено автоматичний макет: введіть тут опис зображення


0

Якщо все виходить з ладу,

робити кліпи до меж методом viewDidLayoutSubviews.

Приклад:

  override func viewDidLayoutSubviews() {

    imageProfile.layer.cornerRadius = imageProfile.bounds.size.width/2
    imageProfile.clipsToBounds = true
    imageProfile.layer.masksToBounds = true
 }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.