Как работает clipsToBounds?

110

Я хотел бы знать, как пользоваться UIViewимуществом clipsToBounds.

В официальной документации сказано следующее:

clipsToBounds свойство

Логическое значение, определяющее, ограничены ли вложенные представления пределами представления.

Обсуждение
Установка этого значения в YESприводит к тому, что подпредставления будут обрезаны до границ получателя. Если установлено NO, подвиды, кадры которых выходят за видимые границы получателя, не обрезаются. Значение по умолчанию - NO.

Но я не понимаю, что именно это означает. Как мне использовать clipsToBounds? Каковы последствия YESточной установки этого свойства ? Или к NO?

Тоши
источник

Ответы:

283

Если мой супервизор представляет собой блок размером 10 единиц с каждой стороны, а мой подпредставление имеет ширину 20 единиц с clipsToBoundsустановленным значением YES, я увижу только ту часть подпредставления, которая вписывается в границы супервизора. В противном случае, если clipsToBoundsустановлено значение NO, я увижу все подпредставление, даже части вне супервизора (при условии, что мы все еще на экране).

В качестве наглядного примера рассмотрим следующие представления, установленные на раскадровке:

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

Это белая UIViewметка в верхнем левом углу с простой цифрой «1» или «2», чтобы я мог обсуждать их как view1или view2. Кроме того, черный вид имеет тот же размер, что и белый, но его исходная точка находится в центре белого вида.

В viewDidLoadметоде контроллера представления у нас есть следующий код:

Цель-C:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view1.clipsToBounds = YES;
    self.view2.clipsToBounds = NO;
}

Swift:

override func viewDidLoad() {
    super.viewDidLoad()
    self.view1.clipsToBounds = true
    self.view2.clipsToBounds = false
}

Когда мы запускаем код и смотрим на симулятор или на устройство, мы получаем следующие результаты:

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

Таким образом, несмотря на идентичную настройку этих представлений (за исключением clipsToBounds), они выглядят по-разному. Вот что clipsToBoundsделает. Установка этого значения YESобеспечит лучший результат, а установка значения NO- нижний результат.

Если мы отлаживаем иерархию представлений, мы можем более четко увидеть, что оба черных ящика действительно выходят за границы белого представления, но только представление 2 показывает это, когда приложение действительно работает:

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

нхгриф
источник
3
Фантастический ответ! Отлично сработано. Но у меня есть вопрос. Почему UITextViewне видны тени, если clipsToBoundsсвойство равно true; ? Если это так false, отлично работает
Маннопсон 05
1
Примечание. Вы изменяете clipsToBounds в родительском представлении. Итак, если viewB является подвидом viewA. Это viewA, что clipsToBounds необходимо сделать истинным.
aestusLabs
Какое представление из исходной рамки представления на этом представлении - это жест касания, потому что я проверяю, и он не работает.
Pravin Tate
2

Это должен быть краткий быстрый ответ по сравнению с принятым ответом

Если Apple был переименовать это свойство, я бы назвал его: clipSubviewsToBounds.

Я только что столкнулся с ошибкой в ​​нашем коде. Где была установлена ​​высота родительского представления 0. Мы не ожидали увидеть ни одного из его элементов. Тем не менее, содержимое родительского представления отображалось.

Это было потому, что clipToBoundsне было настроено true. Как только это установлено, trueвысота подвидов не может выходить за пределы 0, поэтому они вообще не отображаются.

Мед
источник
Этот ответ
сильно