Größe UITableViewCell mit UITextView bei der Eingabe
Habe ich einen UITableViewController mit einer benutzerdefinierten Zelle. Jede Zelle wurde mit einer Spitze und enthält einen nicht-scrollbaren UITextView. Ich habe Einschränkungen in jede Zelle, so dass die Zelle passt sich die Höhe dem Inhalt der UITextView. Also zunächst mein controller sieht wie folgt aus :
Nun möchte ich, dass, wenn der Benutzer tippt etwas in eine Zelle, die Ihren Inhalt automatisch anpasst. Diese Frage wurde oft gefragt, siehe insbesondere diese oder die zweite Antwort hier. Ich habe also Folgendes geschrieben Delegierter in meinem code :
- (BOOL) textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text {
[self.tableView beginUpdates];
[self.tableView endUpdates];
return YES;
}
Aber es führt auf das folgende merkwürdige Verhalten : alle Einschränkungen werden ignoriert, und alle Zellen Höhe Kollaps auf den minimalen Wert. Siehe das Bild unten:
Wenn ich nach unten scrollen und die tableView, um Kraft für einen neuen call of cellForRowAtIndexPath, ich wieder die richtigen Höhen für die Zellen:
Hinweis, dass ich nicht implementieren heightForRowAtIndexPath als ich erwarten autoLayout zu kümmern.
Könnte mir jemand sagen was ich falsch gemacht habe oder mir helfen hier ? Ich danke Ihnen sehr !
- Schauen Sie sich meine Antwort auf diesen link (keine auto-layout benötigt werden): die Größe und verschieben von UITableViewCell reibungslos ohne Entlassungen Tastatur
- Hier ist sogar noch besser und einfacher Weg mit autolayout. .
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine schnelle Lösung, die funktioniert gut für mich. Vorausgesetzt, Sie sind mit "auto-layout", müssen Sie einen Wert zuweisen estimatedRowHeight und dann wieder UITableViewAutomaticDimension für die Zeilenhöhe. Endlich etwas tun, ähnlich wie unten in der text-Ansicht delegieren.
CGPointMake(0, scrollTo)
zuCGPoint(x: 0, y: scrollTo)
für Swift 3+ 😉Meine Lösung ist ähnlich zu @atlwx aber ein wenig kürzer. Getestet mit statischen Tabelle.
UIView.setAnimationsEnabled(false)
ist erforderlich, um zu verhindern, dass die Zelle den Inhalt "springen", während Tabelle-updates, die Zelle HöheFolgende Beispiel funktioniert für dynamische Zeilenhöhe als der Benutzer gibt text in die Zelle. Selbst wenn Sie auto-layout aus, das Sie noch umsetzen müssen, die heightForRowAtIndexPath Methode. Für dieses Beispiel funktioniert, Einschränkungen festgelegt werden muss, auf textView in einer solchen Weise, dass, wenn Zelle Höhe steigt textView wird auch in die Höhe wachsen. Dies kann erreicht werden durch hinzufügen eines top-Einschränkung und untere Beschränkung von textView, um den Inhalt einer Zelle anzeigen. Aber nicht die Höhe festlegen Einschränkung für textView selbst. Auch Bildlauf aktivieren für die textView so dass textView die Größe des Inhalts wird aktualisiert, sobald der Benutzer text eingibt. Dann verwenden wir diese Inhalte Größe zur Berechnung der neuen Zeilenhöhe. Solange die Zeilenhöhe ist lang genug, um vertikal zu dehnen die textView, um gleich oder größer als die Größe des Inhalts der text-Ansicht nicht scrollen, auch wenn scrollen aktiviert ist und das ist das, was Sie brauchen, glaube ich.
In diesem Beispiel habe ich nur eine einzige Zeile und ich verwenden Sie nur eine einzelne variable zu verfolgen, die Zeilenhöhe. Aber wenn wir über mehrere Zeilen benötigen wir eine variable für jede Zeile, die sonst alle Zeilen die gleiche Höhe haben. Ein array von rowHeight, entspricht der tableView Datenquelle array kann verwendet werden, in diesem Fall.
Mittels Swift-2.2 (frühere Versionen würde wahrscheinlich auch funktionieren), wenn Sie den TableView zu verwenden, auto Abmessungen (vorausgesetzt, Sie arbeiten in einer Unterklasse
UITableViewController
etwa so:Brauchen Sie nur zur Umsetzung der Stellvertretung in dieser Datei
UITextViewDelegate
, und fügen Sie die unten Funktion, und es sollte funktionieren. Nur denken Sie daran, Ihre textView die Stellvertretungself
(also, vielleicht, nachdem Sie aus der Warteschlange entfernt werden, die Zellecell.myTextView.delegate = self
)Dank "Jose Tomy Joseph" für die Inspiration (damit wirklich) diese Antwort.
Getestet auf iOS 12
Ich habe wirklich versucht viel von Lösungen und fand schließlich eine gute hier
Dies funktioniert mit animation und sieht schön aus. Der trick war die
DispatchQueue.async
block.Ich habe auch
TPKeyboardAvoidingTableView
um sicherzustellen, dass die Tastatur nicht überlappen etwas.UPDATE
Ich habe seltsame springen Probleme, weil der
TPKeyboardAvoidingTableView
. Vor allem, wenn ich gerollt um die Unterseite und dann einUITextView
aktiv wurde.So ersetzte ich
TPKeyboardAvoidingTableView
durch nativeUITableView
und Griff in die Einschübe mich. Der table view ist nicht das scrollen nativ.Habe ich implementiert ein ähnliches Konzept mit einem UITextView wenn Sie es doch tun, die ich umzusetzen hatte heightForRowAtIndexPath
sizingCell ist eine Instanz der Zelle, die ist nur für die Dimensionierung Berechnungen.
Wichtig zu beachten ist, dass müssen Sie die UITextView oberen und unteren Rand, um die UITableViewCells contentView der oberen und unteren Kante, so dass das UITableViewCell änderungen in der Höhe der UITextView auch in der Höhe verändert.
Einschränkung für das layout verwende ich eine PureLayout ( https://github.com/smileyborg/PureLayout ), so dass die folgende Einschränkung layout-code " kann ungewöhnlich für Sie:
Inspiriert durch die beiden vorherigen Antworten, habe ich einen Weg gefunden mein problem zu lösen. Ich denke, die Tatsache, dass ich hatte ein UITextView was einige Probleme mit autoLayout. Ich fügte hinzu, die folgenden zwei Funktionen zu meinem original-code.
wo in der letzten Zeile
31
ist die Summe meiner Einschränkungen an der linken und rechten Seite der Zelle und die20
ist nur einige beliebigem Durchhang.Fand ich diese Lösung beim Lesen dieses diese sehr interessante Antwort.
Der trick, um sofort aktualisieren Sie den tableview-Zellen Höhe in einer glatten Weg ohne Entlassungen die Tastatur ist die Ausführung des folgenden Schnipsel aufgerufen werden, in der textViewDidChange Ereignis, nachdem Sie die Größe der textView oder andere Inhalte, die Sie in der Zelle:
Jedoch wird dies möglicherweise nicht genug sein. Sie sollten auch sicherstellen, dass der tableView hat genug Elastizität um immer den gleichen contentOffset. Bekommen Sie, dass die Elastizität durch die Einstellung der tableView contentInset unten. Ich schlage vor, diese Elastizität Wert zu sein, wenigstens die maximale Entfernung, die Sie benötigen, aus dem Boden der letzten Zelle auf der Unterseite der tableView. So könnte es beispielsweise sein, die Höhe der Tastatur.
Weitere details und einige nützliche extra-Funktionen, um diese Angelegenheit überprüfen Sie bitte die folgenden link:
Die Größe und verschieben von UITableViewCell reibungslos ohne Entlassungen Tastatur
Die Lösung fast jeder vorgeschlagen, ist der Weg zu gehen, werde ich nur hinzufügen eine kleine Verbesserung. Als eine Zusammenfassung:
Einfach die geschätzte Höhe, Tue ich es per storyboard:
Stellen Sie sicher, dass die Einschränkungen für die UITextView richtig setzen, innerhalb der Zelle.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
Ich einfach anrufen:
cell.myTextView.sizeToFit()
Check out das Ziel C Lösung habe ich im folgenden link weiter unten.
Einfach zu implementieren, zu reinigen, und keine Notwendigkeit für ein auto-layout". Keine Einschränkungen erforderlich. Getestet in iOS10 und iOS11.
Die Größe und verschieben von UITableViewCell reibungslos ohne Entlassungen Tastatur