Jak dostosować wysokość widoku tekstowego do jego Zawartości w języku SWIFT?

W moim kontrolerze widoku, mam UITextView. Ten widok tekstu jest wypełniony ciągiem znaków. Sznurek może być krótki lub długi. W zależności od długości łańcucha należy dostosować wysokość widoku tekstowego. Używam storyboardów i auto layout.

Mam pewne problemy z wysokością widoku tekstu.

Czasami wysokość jest idealnie dopasowana do tekstu. Czasami nie, tekst jest przycinany w pierwszej linii. Poniżej widok tekstu jest żółty. niebieski jest containerview wewnątrz scrollview. Fioletowy to miejsce na zdjęcie.

title1title2

Teksty pochodzą z mojej podstawowej bazy danych, są atrybutami łańcuchów. Pomiędzy ekranem 1 i 2, jedyną rzeczą zmienioną jest ciąg znaków.
Jeśli wypisuję ciągi w konsoli mam poprawne teksty:

my amazing new title

Another funny title for demo

Ograniczenia mojego textview :

Tutaj wpisz opis obrazka

Nie rozumiem dlaczego mam 2 różne wyświetlacze.

EDIT

Próbowałem Rady @ Nate, w viewDidLoad, I dodano:

    myTextViewTitle.text="my amazing new title"

    myTextViewTitle.setContentHuggingPriority(1000, forAxis: UILayoutConstraintAxis.Vertical)
    myTextViewTitle.setContentCompressionResistancePriority(1000, forAxis: UILayoutConstraintAxis.Vertical)
    myTextViewTitle.setTranslatesAutoresizingMaskIntoConstraints(false)  

    let views = ["new_view": myTextViewTitle]
    var constrs = NSLayoutConstraint.constraintsWithVisualFormat("|-8-[new_view]-8-|", options: NSLayoutFormatOptions(0), metrics: nil, views: views)
    self.view.addConstraints(constrs)
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-8-[new_view]", options: NSLayoutFormatOptions(0), metrics: nil, views: views))
    self.myTextViewTitle.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[new_view(220@300)]", options: NSLayoutFormatOptions(0), metrics: nil, views: views))

Brak wyników. Z lub bez contraint wysokość dodane dla mojego textview w interface builder...

Edycja 2

Potrzebuję UITextView, a nie UIlabel, z powodu przycisku Wstecz, aby użyć ścieżki wykluczenia.

     let exclusionPathBack:UIBezierPath = UIBezierPath(rect: CGRect(x:backButton.bounds.origin.x, y:backButton.bounds.origin.y, width:backButton.bounds.width+10, height:backButton.bounds.height))
     myTextViewTitle.textContainer.exclusionPaths=[exclusionPathBack]
Author: cmii, 2015-04-03

7 answers

Znalazłem rozwiązanie.

Skupiłem się na wysokości mojego UITextView, a następnie przeczytałem post mówiący o proporcjach. Chciałem Spróbować I to zadziałało!

Więc w storyboardzie dodałem proporcje dla widoku tekstowego i sprawdziłem opcję "Usuń w czasie kompilacji".

In viewDidLayoutSubviews (), I wrote:

override func viewDidLayoutSubviews() {

    super.viewDidLayoutSubviews()

    let contentSize = self.myTextViewTitle.sizeThatFits(self.myTextViewTitle.bounds.size)
    var frame = self.myTextViewTitle.frame
    frame.size.height = contentSize.height
    self.myTextViewTitle.frame = frame

    aspectRatioTextViewConstraint = NSLayoutConstraint(item: self.myTextViewTitle, attribute: .Height, relatedBy: .Equal, toItem: self.myTextViewTitle, attribute: .Width, multiplier: myTextViewTitle.bounds.height/myTextViewTitle.bounds.width, constant: 1)
    self.myTextViewTitle.addConstraint(aspectRatioTextViewConstraint!)

}
Działa idealnie.
 40
Author: cmii,
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-04-14 18:07:17

Najpierw wyłącz przewijanie UITextView. Dwie opcje:

  1. odznacz włączone przewijanie .xib.
  2. [TextView setScrollEnabled: NO];

Utwórz UITextView i połącz go z IBOutlet (TextView). Dodaj ograniczenie wysokości UITextView z domyślną wysokością, połącz je z IBOutlet (TextViewHeightConstraint). Gdy ustawisz tekst UITextView asynchronicznie, powinieneś obliczyć wysokość UITextView i ustawić na niej ograniczenie wysokości UITextView. Próbka kod:

CGSize sizeThatFitsTextView = [TextView sizeThatFits:CGSizeMake(TextView.frame.size.width, MAXFLOAT)];

TextViewHeightConstraint.constant = sizeThatFitsTextView.height; 
 21
Author: Сергей Билык,
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
2016-05-05 10:13:52

W Swift 3.0, gdzie tvHeightConstraint jest ograniczeniem wysokości obiektu TextView (jeśli jest używany dla wielu przeglądów tekstu, dodałby go do wejść funkcji):

func textViewDidChange(textView: UITextView) {

        let size = textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: CGFloat.greatestFiniteMagnitude))
        if size.height != tvHeightConstraint.constant && size.height > textView.frame.size.height{
            tvHeightConstraint.constant = size.height
            textView.setContentOffset(CGPoint.zero, animated: false)
        }
    }

H / t do @cmi i @ Pablo Ruan

 8
Author: agrippa,
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
2017-06-05 18:52:00

W swift 2.3:

 func textViewDidChange(textView: UITextView) {

    let size = textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: CGFloat.max))
    if size.height != TXV_Height.constant && size.height > textView.frame.size.height{
        TXV_Height.constant = size.height
        textView.setContentOffset(CGPointZero, animated: false)
    }
}
 5
Author: Pablo Ruan,
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
2017-01-26 18:17:09

Dlaczego nie mieć obrazu dla przycisku Wstecz i UILabel dla tekstu i użyć autolayout, aby je ustawić? I może trzeci widok na żółte tło.

 0
Author: Koen,
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-04-06 15:27:56

Moje proste rozwiązanie niezwykle podobnego problemu:

Używałem etykiet z liczbą wierszy ustawioną na 0 zamiast próbować używać pól tekstowych lub widoków. Następnie przyciąłem krawędzie prowadzące i końcowe do pojemników etykiet, które ograniczają ich szerokość w moim przypadku, z 0 jako stałą dla ograniczeń. Haczyk polega na ustawieniu liczby linii na 0, aby etykiety mogły rosnąć lub zmniejszać się zgodnie z ich zawartością. Tekst nigdy nie zostanie pocięty, a wysokość etykiet nigdy przekrocz ich zawartość ' dla wszystkich różnych klas wielkości skonfigurowanych dla szerokości (szerokości kontenera w moim przypadku). Testowane dla systemu IOS 8.0 i nowszych (upewnij się również, że "jawne" jest odznaczone obok atrybutów "preferowana szerokość" dla wszystkich etykiet dla szerokości etykiet, aby dostosować je do różnych klas rozmiaru) - działa idealnie.

 0
Author: AshleyC,
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
2016-03-10 07:04:53

Zaadaptowałem Twój kod i użyłem go zarówno dla: layout subview, jak i textViewDidChange. Dziękuję bardzo, że sprawił, że mój dzień po godzinie rozwiązywania problemów...

override func viewDidLayoutSubviews() {

    super.viewDidLayoutSubviews()
    textViewDidChange(self.recordingTitleTV)


}

func textViewDidChange(_ textView: UITextView) {

    let contentSize = textView.sizeThatFits(textView.bounds.size)
    var frame = textView.frame
    frame.size.height = contentSize.height
    textView.frame = frame

    let aspectRatioTextViewConstraint = NSLayoutConstraint(item: textView, attribute: .height, relatedBy: .equal, toItem: textView, attribute: .width, multiplier: textView.bounds.height/textView.bounds.width, constant: 1)
    textView.addConstraint(aspectRatioTextViewConstraint)
}
 0
Author: AppNerd,
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
2018-03-17 16:40:07