Nach vielen Versuchen und Irrtümern gebe ich auf und stelle die Frage. Ich habe viele Leute mit ähnlichen Problemen gesehen, kann aber nicht alle Antworten richtig verstehen.
Ich habe eine, UITableView
die aus benutzerdefinierten Zellen besteht. Die Zellen bestehen aus 5 Textfeldern nebeneinander (ähnlich einem Raster).
Wenn ich versuche, die Zellen am unteren Rand der zu scrollen und zu bearbeiten UITableView
, kann ich meine Zellen nicht richtig über der Tastatur positionieren.
Ich habe viele Antworten gesehen, die über das Ändern der Ansichtsgröße usw. sprachen, aber bisher hat keine davon gut funktioniert.
Könnte jemand anhand eines konkreten Codebeispiels den "richtigen" Weg dazu klären?
Antworten:
Wenn Sie UITableViewController anstelle von UIViewController verwenden, wird dies automatisch durchgeführt.
quelle
Die Funktion zum Scrollen könnte viel einfacher sein:
Das ist es. Überhaupt keine Berechnungen.
quelle
contentInset
, was bei der Anfrage nachvisibleRows
oder anscheinend nicht berücksichtigt wirdindexPathsForVisibleRows
.Ich mache etwas sehr ähnliches, es ist generisch, es ist nicht nötig, etwas Spezifisches für Ihren Code zu berechnen. Überprüfen Sie einfach die Anmerkungen zum Code:
In MyUIViewController.h
In MyUIViewController.m
Swift 1.2+ Version:
quelle
[tableView scrollToRowAtIndexPath: indexPath atScrollPosition: UITableViewScrollPositionMiddle animated: YES];
MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate]; CGFloat tabBarHeight = appDelegate.tabBarController.tabBar.frame.size.height;
Subtrahieren Sie dann tabBarHeight von der Tastaturhöhe, wo immer Sie die Tastaturhöhe verwenden.Die einfachste Lösung für Swift 3 , basierend auf der Lösung von Bartłomiej Semańczyk :
quelle
Notification
stattNSNotification
wäre eher "Swift 3-y" :-)Ich hatte das gleiche Problem, bemerkte jedoch, dass es nur in einer Ansicht angezeigt wird. Also fing ich an, nach den Unterschieden in den Controllern zu suchen.
Ich fand heraus, dass das Bildlaufverhalten in
- (void)viewWillAppear:(BOOL)animated
der Superinstanz eingestellt ist.Stellen Sie also sicher, dass Sie Folgendes implementieren:
Und es spielt keine Rolle, ob Sie
UIViewController
oder verwendenUITableViewController
; überprüfte es, indem man eineUITableView
als Unteransicht von self.view in dieUIViewController
. Es war das gleiche Verhalten. In der Ansicht konnte nicht gescrollt werden, wenn der Anruf[super viewWillAppear:animated];
fehlte.quelle
Ich habe das vielleicht verpasst, da ich nicht den ganzen Beitrag hier gelesen habe, aber was ich mir ausgedacht habe, scheint täuschend einfach zu sein. Ich habe dies nicht durch den Wringer gestellt und in allen Situationen getestet, aber es scheint, als sollte es gut funktionieren.
Passen Sie einfach den contentInset der Tabellenansicht an die Höhe der Tastatur an und scrollen Sie die Zelle nach unten:
und natürlich
ist das zu einfach vermisse ich etwas Bisher funktioniert es gut für mich, aber wie gesagt, ich habe es nicht durch den Wringer gesteckt ...
quelle
[aNotification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue]
contentInset
und die Bildlaufgrenzen scharf ändert.Ich glaube, ich habe eine Lösung gefunden, die dem Verhalten von Apples Apps entspricht.
Zuerst in Ihrer viewWillAppear: Abonnieren Sie die Tastaturbenachrichtigungen, damit Sie wissen, wann die Tastatur ein- und ausgeblendet wird, und das System Ihnen die Größe der Tastatur anzeigt. Vergessen Sie jedoch nicht, die Registrierung in Ihrer viewWillDisappear: aufzuheben.
Implementieren Sie die folgenden Methoden, damit Sie die Größe Ihrer tableView so anpassen, dass sie mit dem sichtbaren Bereich übereinstimmt, sobald die Tastatur angezeigt wird. Hier verfolge ich den Status der Tastatur separat, damit ich selbst auswählen kann, wann die tableView wieder auf die volle Höhe eingestellt werden soll, da Sie diese Benachrichtigungen bei jeder Feldänderung erhalten. Vergessen Sie nicht, keyboardWillHide: zu implementieren, und wählen Sie einen geeigneten Ort, um Ihre tableView-Größe festzulegen.
Hier ist das Bildlaufbit. Wir arbeiten zuerst einige Größen aus, dann sehen wir, wo wir uns im sichtbaren Bereich befinden, und stellen das Rechteck, auf das wir scrollen möchten, so ein, dass es entweder die Halbansicht über oder unter der Mitte des Textfelds ist auf wo es in der Ansicht ist. In diesem Fall haben wir ein Array von UITextFields und eine Aufzählung, die diese verfolgt. Wenn Sie also rowHeight mit der Zeilennummer multiplizieren, erhalten Sie den tatsächlichen Versatz des Frames in dieser Außenansicht.
Das scheint ganz gut zu funktionieren.
quelle
UIKeyboardBoundsUserInfoKey
ist ab iOS 3.2 veraltet. Siehe meine Lösung unten, die für alle aktuellen iOS-Versionen ≥ 3.0 funktioniert. / @ iPhoneDevWenn Sie verwenden können
UITableViewController
, erhalten Sie die Funktionalität kostenlos. Manchmal ist dies jedoch keine Option, insbesondere wenn Sie mehrere Ansichten benötigen, nicht nur dieUITableView
.Einige der hier vorgestellten Lösungen funktionieren nicht unter iOS ≥4, andere nicht auf dem iPad oder im Querformat, andere nicht für Bluetooth-Tastaturen (bei denen kein Bildlauf gewünscht wird), andere nicht Arbeit beim Umschalten zwischen mehreren Textfeldern. Wenn Sie sich für eine Lösung entscheiden, sollten Sie diese Fälle testen. Dies ist die Lösung , die wir
verwendenverwenden in InAppSettingsKit :Hier ist der vollständige Code der Klasse in InAppSettingsKit. Verwenden Sie zum Testen den untergeordneten Bereich "Vollständige Liste", in dem Sie die oben genannten Szenarien testen können.
quelle
Die einfachste Lösung für Swift :
quelle
Ich hoffe ihr habt schon eine Lösung, wenn ihr all diese liest. Aber ich fand meine Lösung wie folgt. Ich erwarte, dass Sie bereits eine Zelle mit haben
UITextField
. Behalten Sie also beim Vorbereiten den Zeilenindex im Tag des Textfelds.Erstellen Sie eine
activeTextField
InstanzUITextField
mit globalem Gültigkeitsbereich wie folgt:Jetzt kopieren Sie einfach meinen Code und fügen ihn am Ende ein. Und vergessen Sie auch nicht hinzuzufügen
UITextFieldDelegate
Registriert die Tastatur
notifications
Griffe Tastatur
Notifications
:Wird aufgerufen, wenn das
UIKeyboardDidShowNotification
gesendet wird.Wird aufgerufen, wenn das
UIKeyboardWillHideNotification
gesendet wirdJetzt bleibt noch eines übrig: Rufen Sie die
registerForKeyboardNotifications
Methode in derViewDidLoad
Methode wie folgt auf:Sie sind fertig, hoffen, dass Ihr
textFields
Wille nicht mehr von der Tastatur verdeckt wird.quelle
Das Kombinieren und Ausfüllen der Lücken aus mehreren Antworten (insbesondere Ortwin Gentz, Benutzer 98013) und einem anderen Beitrag funktioniert sofort für SDK 4.3 auf einem iPad im Hoch- oder Querformat:
quelle
Wenn Sie eine geeignete Ansicht verwenden, um Ihre Textfelder ( von Jeff Lamarche ) zu platzieren, können Sie die Tabellenansicht einfach mit der Delegate-Methode wie folgt scrollen.
(Hinweis: Meine Textfelder werden in einem Array mit demselben Index wie die Zeile in der Tabellenansicht gespeichert.)
quelle
Tastaturbenachrichtigungen funktionieren, aber der Beispielcode von Apple setzt voraus, dass die Bildlaufansicht die Stammansicht des Fensters ist. Dies ist normalerweise nicht der Fall. Sie müssen Registerkartenleisten usw. ausgleichen, um den richtigen Versatz zu erhalten.
Es ist einfacher als es klingt. Hier ist der Code, den ich in einem UITableViewController verwende. Es hat zwei Instanzvariablen, hiddenRect und keyboardShown.
quelle
UIKeyboardCenterEndUserInfoKey
undUIKeyboardBoundsUserInfoKey
sind ab iOS 3.2 veraltet. Siehe meine Lösung unten, die für alle aktuellen iOS-Versionen ≥ 3.0 funktioniert.Wenn Sie verwenden
Three20
, verwenden Sie dieautoresizesForKeyboard
Eigenschaft. Stellen Sie einfach die-initWithNibName:bundle
Methode Ihres View Controllers einDies kümmert sich um:
Gemacht und gemacht.
quelle
Mein Ansatz:
Ich unterteile zuerst UITextField und füge eine indexPath-Eigenschaft hinzu. In der cellFor ... -Methode übergebe ich die indexPath-Eigenschaft.
Dann füge ich folgenden Code hinzu:
zum textFieldShould / WillBegin ... etc.
Wenn die Tastatur verschwindet, müssen Sie sie umkehren mit:
quelle
Eine optimierte Lösung. Es wird in die UITextField-Delegatmethoden integriert, sodass kein Durcheinander mit UIKeyboard-Benachrichtigungen erforderlich ist.
Implementierungshinweise:
kSettingsRowHeight - Die Höhe einer UITableViewCell.
offsetTarget und offsetThreshold basieren auf kSettingsRowHeight. Wenn Sie eine andere Zeilenhöhe verwenden, setzen Sie diese Werte auf die y-Eigenschaft von point. [alt: Berechne den Zeilenversatz auf andere Weise.]
}}
}}
quelle
Verwenden Sie die
UITextField's
delegate
Methode:Schnell
Ziel c
quelle
Swift 4.2 Komplettlösung
Ich habe GIST mit einer Reihe von Protokollen erstellt , die die Arbeit mit dem Hinzufügen von zusätzlichem Speicherplatz vereinfachen, wenn die Tastatur angezeigt, ausgeblendet oder geändert wird.
Eigenschaften :
Verwendung
Grundlegendes Verwendungsbeispiel in View Controller, das eine Bildlaufansicht enthält (Tabellenansicht wird natürlich auch unterstützt).
Kern: Frame wechselt Beobachter
Das Protokoll
KeyboardChangeFrameObserver
löst jedes Mal ein Ereignis aus, wenn der Tastaturrahmen geändert wurde (einschließlich Anzeigen, Ausblenden, Ändern des Rahmens).addKeyboardFrameChangesObserver()
anviewWillAppear()
oder ähnliche Methode.removeKeyboardFrameChangesObserver()
anviewWillDisappear()
oder ähnliche Methode.Implementierung: Bildlaufansicht
ModifableInsetsOnKeyboardFrameChanges
Das ProtokollUIScrollView
unterstützt das Kernprotokoll. Es ändert die Einfügungen der Bildlaufansicht, wenn der Tastaturrahmen geändert wird.Ihre Klasse muss die Bildlaufansicht einstellen. Die Einfügungen werden bei Änderungen des Tastaturrahmens vergrößert / verkleinert.
quelle
Da Sie Textfelder in einer Tabelle haben, ist es am besten, die Größe der Tabelle zu ändern. Sie müssen den tableView.frame so einstellen, dass er um die Größe der Tastatur kleiner ist (ich denke etwa 165 Pixel), und ihn dann erneut erweitern, wenn Die Tastatur wird entlassen.
Optional können Sie zu diesem Zeitpunkt auch die Benutzerinteraktion für tableView deaktivieren, wenn der Benutzer nicht scrollen soll.
quelle
Dies funktioniert perfekt und auch auf dem iPad.
quelle
Ich habe fast den gleichen Ansatz versucht und mir einen einfacheren und kleineren Code dafür ausgedacht. Ich habe ein IBOutlet iTextView erstellt und es mit dem UITextView im IB verknüpft.
quelle
Nach stundenlanger anstrengender Arbeit beim Versuch, diese aktuellen Lösungen zu verwenden (und völlig gescheitert), habe ich endlich die Dinge zum Laufen gebracht und sie aktualisiert, um die neuen Animationsblöcke zu verwenden. Meine Antwort basiert vollständig auf der obigen Antwort von Ortwin .
Aus irgendeinem Grund funktionierte der obige Code für mich einfach nicht. Mein Setup schien anderen ziemlich ähnlich zu sein, aber vielleicht, weil ich auf einem iPad oder 4.3 war ... keine Ahnung. Es war ein bisschen verrückt zu rechnen und meine Tischansicht vom Bildschirm zu schießen.
Siehe Endergebnis meiner Lösung: http://screencast.com/t/hjBCuRrPC (Bitte ignorieren Sie das Foto .:-P)
Also ging ich zum Kern dessen über, was Ortwin tat, änderte jedoch die Art und Weise, wie Mathematik berechnet wurde, um den Ursprung und die Größe meiner Tabellenansicht mit der Höhe der Tastatur zu addieren. Wenn ich die Höhe des Fensters von diesem Ergebnis subtrahiere, wird mir angezeigt, wie viel Schnittpunkt ich habe. Wenn es größer als 0 ist (auch bekannt als Überlappung), führe ich die Animation der Rahmenhöhe durch.
Darüber hinaus gab es einige Probleme beim erneuten Zeichnen, die behoben wurden, indem 1) auf das Scrollen zur Zelle gewartet wurde, bis die Animation abgeschlossen war, und 2) die Option UIViewAnimationOptionBeginFromCurrentState beim Ausblenden der Tastatur verwendet wurde.
Ein paar Dinge zu beachten.
Auch hier wäre ich dieser Antwort nicht nahe gekommen, wenn Ortwin nicht den Kern davon geliefert hätte. Hier ist der Code:
quelle
Diese Lösung funktioniert für mich, bitte beachten Sie die Zeile
Sie können den Wert 160 so ändern, dass er mit Ihnen übereinstimmt
quelle
Sehr interessanter Diskussionsthread, ich stand auch vor dem gleichen Problem, das vielleicht schlimmer ist, weil
So lesen Sie die Threads hier und umgesetzt meine Version, die mir geholfen , in Hochschieben meine Inhalte in iPad im Landschaftsmodus. Hier ist Code (dies ist nicht narrensicher und alles, aber es hat mein Problem behoben). Zuerst müssen Sie einen Delegaten in Ihrer benutzerdefinierten Zellenklasse haben, der zu Beginn der Bearbeitung das Textfeld an Ihren Ansichtscontroller sendet und dort das aktive Feld = theTextField setzt
// IMPLEMENTIERT NUR FÜR DEN LANDSCHAFTSMODUS
// Wird aufgerufen, wenn die UIKeyboardWillHideNotification gesendet wird
-anoop4real
quelle
Ich habe ein solches Problem gerade selbst gelöst, nachdem ich auf eine Vielzahl von Lösungen verwiesen habe, die über Google und Stack Overflow gefunden wurden.
Stellen Sie zunächst sicher, dass Sie ein IBOutlet Ihres UIScrollView eingerichtet haben. Schauen Sie sich dann Apple Doc: Keyboard Management genau an . Wenn Sie den Hintergrund scrollen können, die Tastatur jedoch weiterhin die Textfelder abdeckt, sehen Sie sich bitte diesen Code an:
Der Hauptunterschied zwischen diesem Stück und dem von Apple liegt im if-Zustand. Ich glaube, dass Apples Berechnung der Bildlaufentfernung und der Bedingung, ob das von der Tastatur abgedeckte Textfeld nicht korrekt ist, meine Änderung wie oben vorgenommen hat.
Lass mich wissen ob es funktioniert
quelle
Ein Beispiel in Swift unter Verwendung des genauen Punkts des Textfelds aus Get indexPath von UITextField in UITableViewCell mit Swift :
quelle
Eine andere einfache Methode (funktioniert nur mit einem Abschnitt)
quelle
Wenn Ihre UITableView von einer Unterklasse von UITableViewController und nicht von UITableView verwaltet wird und der Textfelddelegierte der UITableViewController ist, sollte der gesamte Bildlauf automatisch verwaltet werden - all diese anderen Kommentare sind in der Praxis sehr schwer zu implementieren.
Ein gutes Beispiel finden Sie im Apple-Beispielcodeprojekt: TaggedLocations.
Sie können sehen, dass es automatisch scrollt, aber es scheint keinen Code zu geben, der dies tut. Dieses Projekt verfügt auch über benutzerdefinierte Tabellenansichtszellen. Wenn Sie also Ihre Anwendung als Leitfaden erstellen, sollten Sie das gewünschte Ergebnis erhalten.
quelle
Hier ist, wie ich diese Arbeit gemacht habe, die eine Mischung aus den Antworten von Sam Ho und Marcel W und einigen meiner eigenen Fehlerkorrekturen an meinem beschissenen Code ist. Ich habe einen UITableViewController verwendet. Die Größe der Tabelle wird jetzt korrekt geändert, wenn die Tastatur angezeigt wird.
1) In
viewDidLoad
Ich fügte hinzu:self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
2) Ich hatte vergessen, die
super
Äquivalente inviewWillAppear
und zu nennenawakeFromNib
. Ich habe diese wieder hinzugefügt.quelle
UITableViewController
führt das Scrollen tatsächlich automatisch durch. Der Unterschied zur Verwendung von aUIViewController
besteht darin, dass Sie Navbar-Buttonitems programmgesteuert mithilfe von erstellen müssenNavigationController
, wenn Sie a verwendenTableViewController
.quelle