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.
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 :
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]
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.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:
- odznacz włączone przewijanie .xib.
- [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;
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
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)
}
}
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.
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.
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)
}
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