UITextView wewnątrz UIScrollView z AutoLayout

Próbuję umieścić UITextView wewnątrz UIScrollView z AutoLayout bez powodzenia. To co próbowałem to,

  • umieściłem UIScrollView wewnątrz głównego widoku w Storyboard
  • umieściłem UITextView wewnątrz UIScrollView w Storyboard i wyłączyłem przewijanie włączone
  • ustawiam ograniczenia (początek, koniec, góra, dół) na UIScrollView
  • ustawiam ograniczenia (Góra, początek, koniec, wysokość) na UITextView
  • I created IBOutlet of height ograniczenie UITextView
  • ustawiłem tekst (dużo tekstu, który może powodować przewijanie) na UITextView w viewDidLoad ()
  • ustawiłem ograniczenie wysokości UITextView za pomocą poniższego kodu. Wypróbowałem go zaraz po ustawieniu tekstu w viewDidLoad () i viewdidlayoutsubviews () bez powodzenia

self.textViewHeightConstraint.constant = [self.textView sizeThatFits:CGSizeMake(self.textView.frame.size.width, FLT_MAX)].height;

UITextView osiąga swoją wysokość, ale UIScrollView nie. czy jest coś, co przegapiłem?

Author: Sodbileg Gansukh, 2014-12-26

4 answers

Po kilku dniach badań i pobrudzeniu sobie rąk UIScrollView + UITextView + Auto Layout, udało mi się uzyskać w pełni działający UIScrollView. Chcę podzielić się moim rozwiązaniem na wypadek, gdyby ktoś tkwił w tej samej sytuacji.

  1. Dodaj UIScrollView wewnątrz głównego widoku w Storyboard
  2. Dodaj UIView wewnątrz UIScrollView
  3. Dodaj UITextView wewnątrz UIView (widok dodany w Kroku 2)
  4. Upewnij się, że "przewijanie włączone" UITextView jest unchecked
  5. Dodaj 4 ograniczenia (początek, koniec, góra, dół) w UIScrollView
  6. Dodaj 4 ograniczenia (początek, koniec, góra, dół) na UIView (widok dodany w Kroku 2)
  7. Dodaj ograniczenie "Szerokość równo" na UIView (widok dodany w Kroku 2) i widok główny
  8. dodaj 5 ograniczeń (początek, koniec, góra, dół, wysokość) w UITextView. Po tym kroku nie powinieneś otrzymywać żadnych błędów i ostrzeżeń dotyczących ograniczeń.
  9. Dodaj ograniczenie wysokości UITextView IBOutlet na ViewController. @property (nonatomic, weak) IBOutlet NSLayoutConstraint *textViewHeightConstraint; i podłączyć go w Storyboard
  10. Zmień programowo ograniczenie wysokości UITextView. self.textViewHeightConstraint.constant = [self.textView sizeThatFits:CGSizeMake(self.textView.frame.size.width, CGFLOAT_MAX)].height;

Po wszystkich tych 10 krokach, otrzymasz w pełni działający UIScrollView z UITextView w środku i będziesz szczęśliwy.

 85
Author: Sodbileg Gansukh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-13 02:27:27

Wydaje się, że to pytanie ma odpowiedź, która działa na wiele osób. Należy jednak zauważyć, że dokumentacja stwierdza:

Umieszczanie widoku tekstowego wewnątrz widoku przewijania. widoki tekstowe obsługują własne przewijanie. Nie należy osadzać obiektów widoku tekstowego w widokach przewijania. Jeśli to zrobisz, może to spowodować nieoczekiwane zachowanie, ponieważ zdarzenia dotyku dla obu obiektów mogą zostać pomieszane i nieprawidłowo obsługiwane.

Zanim spróbujesz umieścić UITextView w UIScrollView należy rozważyć, czy jest to naprawdę konieczne. Jeśli Widok tekstowy jest częścią złożonego układu w widoku przewijania, zwróć uwagę na użycie kontenera UIView w zaakceptowanej odpowiedzi.

Zobacz także: przewijanie widoków wewnątrz przewijania widoków

 8
Author: Suragch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-04 02:36:10

Jeśli zauważyłeś, że Układ Auto wciąż narzeka na wysokość UIScrollView -

Problem polega na tym, że domyślnie UITextView sprawdził "przewijanie włączone" w IB.

Więc znajdź to pole wyboru i odznacz je.

Tutaj wpisz opis obrazka

 4
Author: Vitya Shurapov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-22 15:13:04

Rozwiązanie Sodbilega powyżej działa, ale nie potrzebujesz wszystkich jego kroków. Dostałem mój widok przewijania do przewijania z widokiem tekstowym wewnątrz, wykonując jego kroki w kroku 7. W kroku 8 dodałem ograniczenia 4, ale nie wysokość (nie zapomnij o ograniczeniu dolnym!!). Nie zrobiłem reszty.

Nie jestem pewien, ale wydaje się, że wysokość widoku tekstowego dostosowuje się automatycznie zamiast konieczności ręcznej zmiany.

 0
Author: Noor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-07 04:59:26