Jak działa clipsToBounds?

110

Chciałbym wiedzieć, jak korzystać z UIViewnieruchomości clipsToBounds.

Oficjalna dokumentacja mówi, co następuje:

clipsToBounds własność

Wartość logiczna, która określa, czy podglądy są ograniczone do granic widoku.

Dyskusja
Ustawienie tej wartości na YESpowoduje, że podwidoki są przycinane do granic odbiorcy. Jeśli jest ustawiona na NO, podglądy podrzędne, których ramki wykraczają poza widoczne granice odbiorcy, nie są przycinane. Wartość domyślna to NO.

Ale nie jestem pewien, co to dokładnie oznacza. Jak powinienem używać clipsToBounds? Jakie są konsekwencje ustawienia tej właściwości na YESdokładnie? Albo do NO?

Toshi
źródło

Odpowiedzi:

283

Jeśli mój superwidok to pole o wymiarach 10 jednostek z każdej strony, a mój widok podrzędny ma 20 jednostek szerokości, z clipsToBoundsustawieniem na YES, zobaczę tylko część widoku podrzędnego, która mieści się w granicach widoku podrzędnego. W przeciwnym razie, jeśli clipsToBoundsjest ustawiona na NO, zobaczę cały widok podrzędny, nawet części poza podglądem superwizji (zakładając, że nadal jesteśmy na ekranie).

Jako wizualny przykład rozważ następujące widoki skonfigurowane w scenorysie:

wprowadź opis obrazu tutaj

To jest biała UIView, etykieta w lewym górnym rogu z prostym „1” lub „2”, więc mogę je omówić jako view1lub view2. Dodatkowo widok czarny ma taki sam rozmiar jak widok biały, ale jego początek znajduje się w środku widoku białego.

W viewDidLoadmetodzie kontrolera widoku mamy następujący kod:

Cel C:

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

Szybki:

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

Kiedy uruchamiamy kod i patrzymy na niego w symulatorze lub na urządzeniu, otrzymujemy następujące wyniki:

wprowadź opis obrazu tutaj

Tak więc, pomimo identycznej konfiguracji tych widoków (z wyjątkiem clipsToBounds), wyglądają one inaczej. To jest to, co clipsToBoundsrobi. Ustawienie jej na YESzapewni najwyższy wynik, a ustawienie NOna najniższy wynik.

Jeśli debugujemy hierarchię widoku, zobaczymy wyraźniej, że oba czarne pola faktycznie wykraczają poza granice białego widoku, ale tylko widok 2 pokazuje to, gdy aplikacja jest faktycznie uruchomiona:

wprowadź opis obrazu tutaj

nhgrif
źródło
3
Fantastyczna odpowiedź! Dobra robota. Ale mam pytanie. Dlaczego UITextViewcienie nie są widoczne, jeśli clipsToBoundswłaściwość jest równa true; ? Jeśli tak false, działa dobrze
Mannopson
1
Uwaga: to widok nadrzędny, w którym zmieniasz clipsToBounds. Więc jeśli widokB jest podziałem widoku A. To pogląd, że clipsToBounds muszą być prawdziwe.
aestusLabs
Który widok jest wyświetlany z oryginalnej ramki widoku w tym widoku, działa gestem dotknięcia, ponieważ sprawdzam i nie działa.
Pravin Tate
2

Ma to być zwięzła, szybka odpowiedź w porównaniu z akceptowaną odpowiedzią

Jeśli Apple było zmienić nazwę tę właściwość, chciałbym wymienić go: clipSubviewsToBounds.

Właśnie natrafiłem na błąd w naszym kodzie. Gdzie ustawiono wysokość widoku macierzystego 0. Spodziewaliśmy się, że nie zobaczymy żadnego z jego elementów. Jednak zawartość widoku rodziców pojawiała się.

To dlatego, że clipToBoundsnie był ustawiony true. Po ustawieniu truewysokości podglądów podrzędnych nie może wykraczać poza 0, więc w ogóle się nie wyświetlają.

kochanie
źródło
Ta odpowiedź jest niedoceniana
sasquatch