UITextView all’interno di UIScrollView con AutoLayout

Sto cercando di posizionare UITextView all’interno di UIScrollView con AutoLayout senza fortuna. Quello che ho provato è,

  • Ho inserito UIScrollView all’interno della vista principale in Storyboard
  • Ho inserito UITextView all’interno di UIScrollView in Storyboard e disabilitato Scrolling Enabled
  • Ho impostato i vincoli (iniziale, finale, superiore, inferiore) su UIScrollView
  • Ho impostato i vincoli (in alto, in alto, in coda, in altezza) su UITextView
  • Ho creato IBOutlet del vincolo di altezza di UITextView
  • Ho impostato un testo (un sacco di testo che può causare lo scorrimento) su UITextView in viewDidLoad ()
  • Ho impostato un limite di altezza di UITextView con il codice seguente. L’ho provato subito dopo aver impostato il testo in viewDidLoad () e viewDidLayoutSubviews () senza fortuna

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

UITextView sta ottenendo la sua altezza, ma UIScrollView non lo è. C’è qualcosa che ho perso?

Dopo alcuni giorni di ricerche e sporcarmi le mani con UIScrollView + UITextView + Auto Layout, ho ottenuto con successo un UIScrollView perfettamente funzionante. Voglio condividere la mia soluzione nel caso in cui qualcuno potrebbe rimanere bloccato nella stessa situazione.

  1. Aggiungi UIScrollView all’interno della vista principale in Storyboard
  2. Aggiungi UIView all’interno di UIScrollView
  3. Aggiungi UITextView all’interno di UIView (la vista aggiunta nel passaggio 2)
  4. Assicurati che “Scrolling Enabled” di UITextView sia deselezionato
  5. Aggiungi 4 vincoli (in alto, in coda, in alto, in basso) su UIScrollView
  6. Aggiungi 4 vincoli (iniziale, finale, superiore, inferiore) su UIView (la vista aggiunta nel passaggio 2)
  7. Aggiungi il vincolo “Larghezza ugualmente” su UIView (la vista aggiunta nel passaggio 2) e la vista principale
  8. Aggiungi 5 vincoli (iniziale, finale, superiore, inferiore, altezza) su UITextView. Dopo questo passaggio non dovresti ricevere errori e avvisi sui vincoli.
  9. Aggiungi il vincolo di altezza UITextView IBOutlet sul ViewController. @property (nonatomic, weak) IBOutlet NSLayoutConstraint *textViewHeightConstraint; e collegalo in Storyboard
  10. Modificare il vincolo di altezza UITextView a livello di codice. self.textViewHeightConstraint.constant = [self.textView sizeThatFits:CGSizeMake(self.textView.frame.size.width, CGFLOAT_MAX)].height;

Dopo tutti questi 10 passaggi, avrai pienamente funzionante UIScrollView con UITextView e sarai felice.

Sembra che questa domanda abbia una risposta che ha funzionato per un numero di persone. Tuttavia, si dovrebbe notare che la documentazione afferma:

Inserimento di una visualizzazione di testo all’interno di una vista di scorrimento. Le visualizzazioni di testo gestiscono il proprio scorrimento. Non dovresti incorporare oggetti vista testo nelle viste di scorrimento. In tal caso, può verificarsi un comportamento imprevisto perché gli eventi di touch per i due oggetti possono essere confusi e gestiti in modo errato.

Prima di provare a mettere un UITextView in un UIScrollView dovresti considerare se questo è veramente necessario. Se la visualizzazione del testo fa parte di un layout complesso all’interno della visualizzazione di scorrimento, UIView nota dell’uso del contenitore UIView nella risposta accettata.

Vedi anche: Scroll Views Inside Scroll Views

Ho un esempio funzionante di come calcolare l’altezza per l’altezza dynamic di UITextView + è all’interno di UIStackView che si trova all’interno di UIScrollView qui: https://github.com/fassko/ScrollStackViewExample