Como o clipsToBounds funciona?


110

Gostaria de saber como usar o UIViewimóvel clipsToBounds.

A documentação oficial diz o seguinte:

clipsToBounds propriedade

Um valor booleano que determina se as subvisualizações estão confinadas aos limites da exibição.

Discussão
Definir este valor para YESfaz com que as subvisualizações sejam recortadas para os limites do receptor. Se definido como NO, as subvisualizações cujos quadros se estendem além dos limites visíveis do receptor não são cortadas. O valor padrão é NO.

Mas não estou certo do que isso significa exatamente. Como devo usar clipsToBounds? Quais são as consequências de definir YESexatamente essa propriedade ? Ou para NO?

Respostas:


283

Se meu superview for uma caixa medindo 10 unidades de cada lado, e meu subview tiver 20 unidades de largura, com clipsToBoundsdefinido como YES, verei apenas a parte do subview que se encaixa dentro dos limites do superview. Caso contrário, se clipsToBoundsestiver definido como NO, verei a subvisualização inteira, até mesmo as partes fora da visão geral (assumindo que ainda estejamos na tela).

Como um exemplo visual, considere as seguintes visualizações configuradas no storyboard:

insira a descrição da imagem aqui

Este é um UIViewrótulo branco no canto superior esquerdo com um simples "1" ou "2" para que eu possa discutir como view1ou view2. Além disso, a visualização em preto tem o mesmo tamanho que a visualização em branco, mas sua origem está no centro da visualização em branco.

No viewDidLoadmétodo do view controller , temos o seguinte código:

Objective-C:

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

Rápido:

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

Quando executamos o código e olhamos no simulador ou no dispositivo, obtemos os seguintes resultados:

insira a descrição da imagem aqui

Portanto, apesar dessas visualizações serem configuradas de forma idêntica (exceto clipsToBounds), elas parecem diferentes. Isso é o que clipsToBoundsfaz. Definir como YESfornecerá o resultado superior, enquanto defini-lo como NOfornecerá o resultado inferior.

Se depurarmos a hierarquia de visualização, poderemos ver mais claramente que as caixas pretas realmente se estendem além das bordas da visualização em branco, mas apenas a visualização 2 mostra isso quando o aplicativo está realmente em execução:

insira a descrição da imagem aqui


3
Resposta fantástica! Bem feito. Mas eu tenho uma pergunta. Por que as UITextViewsombras não são visíveis, se a clipsToBoundspropriedade for igual a true; ? Se for false, funciona bem
Mannopson

1
Nota: É a visualização pai em que você altera clipsToBounds. Portanto, se viewB é uma subvisão de viewA. É viewA que clipsToBounds precisa se tornar verdadeiro.
aestusLabs

Qual visualização mostrada do quadro de visualização original nessa visualização está funcionando com o gesto de toque, porque eu verifico e não está funcionando.
Pravin Tate

2

Esta é uma resposta sucinta e rápida vs. a resposta aceita

Se a Apple foi para renomear esta propriedade, eu nomeá-lo: clipSubviewsToBounds.

Acabei de encontrar um bug em nosso código. Onde a altura da visualização principal foi definida 0. Esperávamos ver nenhum de seus elementos. Ainda assim, o conteúdo da visão pai estava aparecendo.

Foi porque clipToBoundsnão foi definido para true. Depois que isso é definido true, as alturas das subvisualizações não podem se estender além 0, portanto, elas não aparecem de forma alguma.


Esta resposta é subestimada
sasquatch
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.