UITableViewCell mit UITextView Höhe in iOS 7?
Wie kann ich die Berechnung der Höhe einer UITableViewCell mit einem UITextView im es in iOS 7?
Fand ich viele Antworten auf ähnliche Fragen, aber sizeWithFont:
findet in jeder Lösung und diese Methode ist veraltet!
Ich weiß, ich habe zu verwenden - (CGFloat)tableView:heightForRowAtIndexPath:
aber wie berechne ich die Höhe meiner TextView angezeigt werden muss der ganze text?
InformationsquelleAutor der Frage MyJBMe | 2013-08-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste von allen, es ist sehr wichtig zu beachten, dass es einen großen Unterschied zwischen UITextView und UILabel, wenn es darum geht, wie text gerendert wird. Nicht nur, dass UITextView haben Einsätze auf allen Grenzen, sondern auch das text-layout im inneren ist es etwas anders.
Daher
sizeWithFont:
ist ein schlechter Weg zu gehen UITextViews.Statt
UITextView
selbst hat eine Funktion namenssizeThatFits:
die Rückkehr der kleinsten Größe, die benötigt wird, um alle Inhalte derUITextView
innerhalb einer bounding-box, die Sie angeben können.Werden die folgenden arbeiten gleichermaßen für iOS 7 und ältere Versionen, und ab jetzt beinhaltet keine Methoden, die veraltet sind.
Einfache Lösung
Durch diese Funktion wird ein
NSAttributedString
und die gewünschte Breite alsCGFloat
und der Rückkehr der Höhe benötigtDetaillierte Lösung
Da habe ich vor kurzem etwas ähnliches gemacht, ich dachte, ich würde teilen auch einige Lösungen, um die damit verbundenen Fragen, die ich traf. Ich hoffe, es hilft jemand.
Dies ist weit mehr in die Tiefe und deckt die folgenden:
UITableViewCell
basierend auf der Größe benötigt zur Anzeige den vollständigen Inhalt eines enthaltenenUITextView
UITextView
wenn die Größe desUITableViewCell
während der BearbeitungWenn Sie mit einer statischen Tabelle anzeigen, oder Sie haben nur eine bekannte Anzahl von
UITextView
s, Sie können möglicherweise machen Schritt 2 viel einfacher.1. Zuerst überschreiben die heightForRowAtIndexPath:
2. Definieren Sie die Funktion, die berechnet, die erforderlich Höhe:
Hinzufügen eines
NSMutableDictionary
(in diesem Beispiel genannttextViews
) als Instanz-variable auf IhrenUITableViewController
Unterklasse.Verwenden dieses Wörterbuch zum speichern von Referenzen auf die einzelnen
UITextViews
etwa so:(und ja, indexPaths sind gültige Schlüssel für Wörterbücher)
Dieser Funktion berechnen Sie nun die tatsächliche Höhe:
3. Aktivieren Größenänderung während der Bearbeitung
Für die nächsten zwei Funktionen, ist es wichtig, dass die Delegierten des
UITextViews
ist dieUITableViewController
. Wenn Sie etwas anderes brauchen, als die Delegierten, können Sie es umgehen, indem Sie die relevanten Aufrufe von dort aus oder mit der entsprechenden NSNotificationCenter Haken.4. Folgen Sie den cursor während der Bearbeitung
Dadurch wird die
UITableView
Blättern Sie zu der position des Cursors, wenn es nicht im sichtbaren Rect des UITableView:5. Passen Sie sichtbar rect durch die Festlegung der Abstände
Während der Bearbeitung, teilen Sie Ihre
UITableView
gedeckt werden kann, die Tastatur. Wenn die tableviews Einlagen werden nicht angepasst,scrollToCursorForTextView:
werden nicht in der Lage zu navigieren, um den cursor, wenn es an der Unterseite des tableview.Und letzten Teil:
Innen Ihre Sicht laden, melden Sie sich für die Benachrichtigung bei änderungen über die Tastatur
NSNotificationCenter
:Bitte nicht wütend auf mich, dafür, dass diese Antwort so lange. Obwohl nicht alle es ist notwendig, die Frage zu beantworten, ich glaube, dass es auch andere Menschen gibt, die diese direkt Fragen hilfreich sein.
UPDATE:
Als Dave Haupert wies darauf hin, vergaß ich zu zählen die
rectVisible
Funktion:Auch habe ich bemerkt, dass
scrollToCursorForTextView:
weiterhin enthalten sind ein direkter Verweis auf eines der Textfelder in meinem Projekt. Wenn Sie ein problem haben mitbodyTextView
nicht gefunden wird, überprüfen Sie die aktualisierte version der Funktion.InformationsquelleAutor der Antwort Tim Bodeit
Gibt es eine neue Funktion zu ersetzen sizeWithFont, die boundingRectWithSize.
Habe ich noch folgende Funktion um mein Projekt, die macht Gebrauch von der neuen Funktion auf iOS7 und das alte auf iOS niedriger als 7. Es hat im Grunde die gleiche syntax wie sizeWithFont:
Können Sie hinzufügen, dass IOS_NEWER_OR_EQUAL_TO_7 auf Ihrem Präfix.pch-Datei in Ihrem Projekt als:
InformationsquelleAutor der Antwort manecosta
Wenn Sie UITableViewAutomaticDimension ich habe eine wirklich einfache (iOS 8 nur) - Lösung. In meinem Fall ist es eine statische Tabelle anzeigen, aber ich denke, Sie könnten passen dieses für Sie dynamische Prototypen...
Habe ich eine Einschränkung Steckdose für die text-Ansicht ist die Höhe, und ich habe implementiert die folgenden Methoden:
Aber denken Sie daran: die text-Ansicht sein muss, Scrollbar, und Sie müssen setup Ihre Einschränkungen, so dass Sie für die automatische Bemaßung:
Die grundlegende Zelle ist ein Beispiel:
InformationsquelleAutor der Antwort dec-vt100
Tim Bodeit s Antwort ist Super. Ich verwendet den code von Einfachen Lösung, um korrekt die Höhe des Textes anzeigen, und die Höhe nutzen, in
heightForRowAtIndexPath
. Aber ich bin nicht der rest der Antwort zum ändern der Größe der text-Ansicht. Stattdessen habe ich den code schreiben, ändern Sie dieframe
von der text-Ansicht incellForRowAtIndexPath
.Alles funktioniert in iOS 6 und darunter, aber in iOS 7 den text in der text-Ansicht nicht vollständig angezeigt, obwohl die
frame
von der text-Ansicht ist in der Tat geändert. (Ich bin nicht mitAuto Layout
). Es sollte der Grund sein, dass in iOS 7 gibt esTextKit
und die position des Textes wird durch kontrollierteNSTextContainer
imUITextView
. Also in meinem Fall muss ich zum hinzufügen einer Linie um diesomeTextView
um es korrekt in iOS 7.Als in der Dokumentation sagte, was Eigentum tut, ist:
Verlassen, wenn es mit der Standard-Wert nach der Größe des
frame
vonsomeTextView
die Größe destextContainer
wird nicht verändert, führt zu dem Ergebnis, dass der text kann nur angezeigt werden, im Bereich vor der Größenänderung.Und ist es vielleicht notwendig ist, um die
scrollEnabled = NO
in Fall gibt es mehr als einetextContainer
so dass der text-reflow-von einemtextContainer
zu den anderen.InformationsquelleAutor der Antwort PowerQian
Hier ist noch eine Lösung, die darauf abzielt Einfachheit und das schnelle prototyping:
Setup:
UITextView
w/andere Inhalte.TableCell.h
.UITableView
zugeordnet istTableViewController.h
.Lösung:
(1) Hinzufügen
TableViewController.m
:(2) Hinzufügen
TableCell.m
:Erklärung:
So, was hier passiert, ist dies: jeder text-Ansicht ist gebunden an die Höhe der Zellen der Tabelle, die durch vertikale und horizontale Beschränkungen - das bedeutet, dass, wenn die Tabellenzelle Höhe steigt, die text-Ansicht erhöht seine Größe. Ich verwendet eine modifizierte version von @manecosta code zum berechnen der erforderlichen Höhe der text-Ansicht passen Sie den gegebenen text in eine Zelle. Das bedeutet also, dass Sie in einem gegebenen text mit X Anzahl von Zeichen, die
frameForText:
gibt eine Größe, die eine Eigenschaft habensize.height
entspricht der text-Ansicht die gewünschte Höhe ein.Nun, was bleibt ist die Aktualisierung der Zelle ist die Höhe, die entsprechend der gewünschten text-Ansicht ist die Höhe. Und diese wird erreicht bei
heightForRowAtIndexPath:
. Wie bereits in den Kommentaren, dasize.height
ist nur die Höhe für die text-Ansicht und nicht die gesamte Zelle, sollte es einen offset Hinzugefügt werden. In dem Fall des Beispiels, dieser Wert wurde 80.InformationsquelleAutor der Antwort Zorayr
Einen Ansatz, wenn Sie autolayout ist, lassen Sie die autolayout-Motor berechnen Sie die Größe für Sie. Dies ist nicht der effizienteste Ansatz, aber es ist ziemlich bequem (und wohl die meisten genau). Es wird bequemer als die Komplexität der Zelle layout wächst - z.B. plötzlich haben Sie zwei oder mehrere textviews/Felder in der Zelle.
Ich eine ähnliche Frage beantwortet, die mit einer kompletten Probe für die Dimensionierung tableview-Zellen mit auto-layout, hier:
Wie man die Größe superview passend für alle Untersichten mit autolayout?
InformationsquelleAutor der Antwort TomSwift
Die komplett glatte Lösung ist wie folgt.
Zuerst müssen wir die cell-Klasse mit einer textView
Weiter, wir verwenden es in der TableViewController
Hier
minLines
ermöglicht minimale Höhe für das textView - (widerstehen Höhe Minimierung von AutoLayout mit
UITableViewAutomaticDimension).
moveRowAtIndexPath:indexPath:
mit der gleichen indexPath beginnttableViewCell Höhe neu-Berechnung und re-layout.
performWithoutAnimation:
entfernt Nebenwirkung (tableView Inhaltoffset springen auf den Beginn der neuen Zeile während der Eingabe).
Es ist wichtig, zu bewahren
relativeFrameOriginY
(nichtcontentOffsetY
!) während der cell-update, dacontentSize
desZellen vor der aktuellen Zelle könnte die änderung sein, die durch autoLayout Rechnung
in unerwarteter Weise. Es entfernt visual springt auf system Silbentrennung
bei der Eingabe langer Wörter.
Beachten Sie, dass Sie sollten nicht setzen Sie die Eigenschaft
estimatedRowHeight
! DieFolgendes funktioniert nicht
Verwenden Sie nur tableViewDelegate Methode.
==========================================================================
Wenn man nicht Meinung gegen schwache Bindung zwischen tableView und tableViewCell und Aktualisierung der geometrie der tableView aus tableViewCellist es möglich, die Aktualisierung
TextInputTableViewCell
Klasse oben:InformationsquelleAutor der Antwort malex
Ihre Zelle, Höhe wird berechnet, indem UILabel Inhalt, aber alle Texte werden gezeigt, die von TextField.
InformationsquelleAutor der Antwort Ильнур Хазиахметов
ich denke diese Weise können Sie zählen die Höhe des Textes anzeigen und dann ändern Sie die Größe Ihrer tableview cell nach, der Höhe, so dass Sie können zeigen full-text auf Zelle
InformationsquelleAutor der Antwort D-eptdeveloper
Swift version
InformationsquelleAutor der Antwort Adam Smaka
Wenn Sie möchten, um automatisch anpassen
UITableViewCell
's-Höhe entsprechend der Höhe der innerenUITextView
's Höhe. Siehe meine Antwort hier: https://stackoverflow.com/a/45890087/1245231Die Lösung ist ganz einfach und sollte funktionieren seit iOS 7. Stellen Sie sicher, dass die
Scrolling Enabled
option aktiviert ist aus für dieUITextView
innerhalb derUITableViewCell
im StoryBoard.Dann in Ihre UITableViewController die viewDidLoad() legen Sie die
tableView.rowHeight = UITableViewAutomaticDimension
undtableView.estimatedRowHeight > 0
wie:Das ist es.
UITableViewCell
's Höhe wird automatisch angepasst, basierend auf der innerenUITextView
's Höhe.InformationsquelleAutor der Antwort petrsyn
Für iOS 8 und höher können Sie einfach
your_tablview.estimatedrowheight= minheight
Sie wollenInformationsquelleAutor der Antwort Sandy