UITextField – nie mogę kliknąć a jest widoczny. Opis problemu i rozwiązania, czyli jak działa Clip Subviews.

Jakiś czas temu pomogłem rozwiązać jeden problem związany z UITextField i ich konfiguracją w aplikacji.  W aplikacji iOS był pewien formualarz zawierający 2 kolumny UITextField wraz z labelkami. Te text fieldy po lewej stronie można było kliknąć i pojawiała się klawiatura, te po prawej niestety nie. Jaki był problem i gdzie była przyczyna takiego dziwnego zachowania? Rozwiązanie jak się okazało było bardzo proste, a o tym w dalszej części.

Zanim wyjawię powód opiszę nieco strukturę widoku w jakim UITextField były umieszczone. Poniżej zamieszczam wycinek z hierarchi elementów widoku

Screenshot 2014-01-12 23.20.54

...
 - UIScrollView
   - UIView (kontener na cały formularz)
     - UILabel
     - UITextField
     - UILabel
     - UITextField
     - ...

 

W UIScrollView był jakiś widok pełniący rolę kontenera na cały formularz. Ten widok kontener zawierał wszystkie UITextField i UILabel.

Rozmiary poszczególnych elementów były ustawione przez pomyłkę mniej więcej tak:

...
 - UIScrollView (szerokość: 1000px , wysokość: 740px)
   - UIView (szerokość: 400px , wysokość:2000px)
     - UILabel (pozycja x: 0px, pozycja y: 0, szerokość: 200px, wysokość 44px)
     - UITextField (pozycja x: 200px, pozycja y: 0, szerokość: 200px, wysokość 44px)
     - UILabel (pozycja x: 500px, pozycja y: 0, szerokość: 200px, wysokość 44px)
     - UITextField (pozycja x: 700px, pozycja y: 0, szerokość: 200px, wysokość 44px)
     - ...

A powinno być tak (pokazałem tylko wymiar który się zmienił w porównaniu do powyższego, aby informacja była czytelna):

...
 - UIScrollView
   - UIView (szerokość: 1000px)
     - UILabel
     - UITextField
     - UILabel
     - UITextField
     - ...

 

Jak się okazało po analizie, UITextField były nieklikalne, ponieważ były poza ramką (frame)  kontenera UIView

umieszczonego w UIScrollView (przyjrzyj się współrzędnym i rozmiarom), a ich widoczność była spowodowana brakiem zaznaczenia opcji Clip Subviews dla widoku kontenera.

Screenshot 2014-01-12 23.19.37

Gdyby opcja Clip Subviews była zaznaczona, UITexField w prawej kolumnie nie byłyby widoczne, gdyż ich widok rodzic wyświetliłby jedynie te elementy będące wewnątrz jego ramki (frame). Co więc robi opcja Clip Subviews? Przycina podwidoki wykraczające poza ramkę widoku rodzica.

Sprawa prosta jak już wszystko wiadomo, ale ciekawa rzecz do znalezienia w której miałem możliwość pomóc :).

 

Dodaj komentarz