Come funziona clipsToBounds?


110

Vorrei sapere come utilizzare la UIViewproprietà clipsToBounds.

La documentazione ufficiale dice quanto segue:

clipsToBounds proprietà

Un valore booleano che determina se le visualizzazioni secondarie sono limitate ai limiti della visualizzazione.

Discussione L'
impostazione di questo valore su YESfa sì che le visualizzazioni secondarie vengano ritagliate ai limiti del ricevitore. Se impostato su NO, le visualizzazioni secondarie i cui frame si estendono oltre i limiti visibili del ricevitore non vengono ritagliate. Il valore predefinito è NO.

Ma non sono chiaro cosa significhi esattamente. Come dovrei usarlo clipsToBounds? Quali sono le conseguenze dell'impostazione di questa proprietà YESesattamente? O a NO?

Risposte:


283

Se la mia superview è un riquadro che misura 10 unità su ciascun lato e la mia sottoview è larga 20 unità, con clipsToBoundsimpostato su YES, vedrò solo la parte della sottoview che rientra nei limiti della superview. Altrimenti, se clipsToBoundsè impostato su NO, vedrò l'intera sottoview, anche le parti al di fuori della superview (supponendo che siamo ancora sullo schermo).

Come esempio visivo, considera le seguenti visualizzazioni impostate nello storyboard:

inserisci qui la descrizione dell'immagine

Questo è un bianco UIView, un'etichetta nell'angolo in alto a sinistra con un semplice "1" o "2" in modo che io possa discuterne come view1o view2. Inoltre, la vista nera ha le stesse dimensioni della vista bianca, ma la sua origine è al centro della vista bianca.

Nel viewDidLoadmetodo del controller di visualizzazione , abbiamo il seguente codice:

Objective-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
}

Quando eseguiamo il codice e lo guardiamo nel simulatore o sul dispositivo, otteniamo i seguenti risultati:

inserisci qui la descrizione dell'immagine

Quindi, nonostante queste visualizzazioni siano impostate in modo identico (tranne clipsToBounds), hanno un aspetto diverso. Questo è ciò che clipsToBoundsfa. Impostandolo su YESfornirà il risultato migliore, mentre impostandolo su NOfornirà il risultato inferiore.

Se eseguiamo il debug della gerarchia della vista, possiamo vedere più chiaramente che le caselle nere si estendono entrambe oltre i bordi della vista bianca, ma solo la vista 2 mostra questo quando l'app è effettivamente in esecuzione:

inserisci qui la descrizione dell'immagine


3
Risposta fantastica! Molto bene. Ma ho una domanda. Perché le UITextViewombre non sono visibili, se la clipsToBoundsproprietà è uguale a true; ? Se lo è false, funziona bene
Mannopson

1
Nota: è la vista principale in cui modifichi clipsToBounds. Quindi se viewB è una sottoview di viewA. È viewA che clipsToBounds deve essere realizzato.
aestusLabs

Quale vista mostra dal frame della vista originale su quella vista funziona con il gesto del tocco, perché controllo e non funziona.
Pravin Tate,

2

Questa dovrebbe essere una risposta rapida succinta rispetto alla risposta accettata

Se Apple è stata di rinominare questa proprietà, mi piacerebbe nominarlo: clipSubviewsToBounds.

Ho appena riscontrato un bug nel nostro codice. Dove era impostata l'altezza della vista genitore 0. Ci aspettavamo di vedere nessuno dei suoi elementi. Eppure i contenuti della vista genitore venivano visualizzati.

Era perché clipToBoundsnon era impostato true. Una volta impostato, truele altezze delle visualizzazioni secondarie non possono estendersi oltre 0, quindi non vengono visualizzate affatto.


Questa risposta è decisamente sottovalutata
sasquatch il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.