Ich habe Probleme mit meinem Code. Ich versuche das zu verschieben, UIScrollView
wenn ich eine bearbeite UITextField
, die vom Tastatur-Pop ausgeblendet werden soll.
Ich bewege gerade den Hauptrahmen, weil ich nicht weiß, wie ich im Code nach oben scrollen soll. Also habe ich ein bisschen Code gemacht, es funktioniert gut, aber wenn ich ein UI-Textfeld bearbeite und zu einem anderen wechsle, UITextField
ohne auf die Schaltfläche "Zurück" zu klicken, geht die Hauptansicht waaayyyyy zu weit nach oben.
Ich habe eine NSLog()
mit meinen Variablen size, distance und textFieldRect.origin.y erstellt, wie Sie unten sehen können. Wenn ich zwei UITextField
an derselben Stelle (y-Ursprung) platziere und diesen speziellen 'Schalter' mache (ohne die Eingabetaste zu drücken), erhalte ich die gleichen Zahlen, während mein Code für die erste UITextField
Bearbeitung gut funktioniert hat, aber nicht für die zweite Bearbeitung.
Überprüfen Sie dies heraus:
- (void)textFieldDidBeginEditing:(UITextField *)textField {
{
int size;
CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField];
size = textFieldRect.origin.y + textFieldRect.size.height;
if (change == FALSE)
{
size = size - distance;
}
if (size < PORTRAIT_KEYBOARD_HEIGHT)
{
distance = 0;
}
else if (size > PORTRAIT_KEYBOARD_HEIGHT)
{
distance = size - PORTRAIT_KEYBOARD_HEIGHT + 5; // +5 px for more visibility
}
NSLog(@"origin %f", textFieldRect.origin.y);
NSLog(@"size %d", size);
NSLog(@"distance %d", distance);
CGRect viewFrame = self.view.frame;
viewFrame.origin.y -= distance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
[self.view setFrame:viewFrame];
[UIView commitAnimations];
change = FALSE;
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
change = TRUE;
CGRect viewFrame = self.view.frame;
viewFrame.origin.y += distance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
[self.view setFrame:viewFrame];
[UIView commitAnimations];
}
Irgendwelche Ideen ?
quelle
activeField.frame
in einen relativen Rahmen zu konvertieren , daactiveField
dies kein unmittelbares Kind sein mussself.view
. Der aktualisierte Code sollteCGRect aRect = self.view.frame; aRect.size.height -= kbSize.height; CGRect relativeFieldFrame = [activeField convertRect:activeField.frame toView:self.view]; if (!CGRectContainsPoint(aRect, relativeFieldFrame.origin) ) { CGPoint scrollPoint = CGPointMake(0.0, relativeFieldFrame.origin.y-kbSize.height); [self.mainView.scrollView setContentOffset:scrollPoint animated:YES]; }
UIKeyboardFrameEndUserInfoKey
Schlüssel unter iOS 11 verwenden, daUIKeyboardFrameBeginUserInfoKey
mir das oft eine Höhe von Null gab.Ich habe dies gerade mit Swift 2.0 für iOS9 auf Xcode 7 (Beta 6) implementiert, funktioniert hier einwandfrei.
Bearbeitet für Swift 3
Scheint, als müssten Sie nur das einstellen
contentInset
undscrollIndicatorInset
mit Swift 3 wird das Scrollen / contentOffset automatisch durchgeführt.quelle
Alle Antworten hier scheinen die Landschaftsmöglichkeiten zu vergessen. Wenn Sie möchten, dass dies funktioniert, wenn das Gerät in eine Querformatansicht gedreht wird, treten Probleme auf.
Der Trick dabei ist, dass die Ansicht zwar die Ausrichtung kennt, die Tastatur jedoch nicht. Dies bedeutet, dass in Querformat die Breite der Tastatur tatsächlich der Höhe entspricht und umgekehrt.
Um die von Apples empfohlene Methode zum Ändern der Inhaltseinfügungen und zur Unterstützung der Querformatausrichtung zu ändern, würde ich Folgendes empfehlen:
Der Teil, auf den hier geachtet werden muss, ist der folgende:
Dadurch wird erkannt, in welcher Ausrichtung sich das Gerät befindet. Wenn es sich im Querformat befindet, werden die Breiten- und Höhenwerte der KeyboardSize-Variablen ausgetauscht, um sicherzustellen, dass in jeder Ausrichtung die richtigen Werte verwendet werden.
quelle
Swift 4 Lösung:
quelle
UIKeyboardFrameBeginUserInfoKey
zuUIKeyboardFrameEndUserInfoKey
UIKeyboardWillShow
,UIKeyboardWillHide
UndUIKeyboardFrameBeginUserInfoKey
umbenannt wurdeUIResponder.keyboardWillShowNotification
,UIResponder.keyboardWillHideNotification
undUIResponder.keyboardFrameBeginUserInfoKey
.Für dieses Zeug, das nicht viel Codierung benötigt, ist es wie im folgenden Code sehr einfach: -
Ihr gesamter Text in UIScrollview von der Feder wie dieses Bild: -
YourViewController.h
Verbinden Sie IBOutlet von nib und verbinden Sie außerdem jeden Delegaten von UItextfiled und Scrollview-Delegaten von NIB
HINWEIS Wenn kein Delegierter mit Textdatei verbunden ist, funktioniert keine Methode. Stellen Sie sicher, dass alle iBOulate und Delegaten korrekt verbunden sind
quelle
Apples Empfehlung in Swift + unter Verwendung von UIScrollView mit automatischem Layout in iOS neu codiert (basierend auf den folgenden Links: Link 1 , Link 2 , Link 3 ):
quelle
Das einzige, was ich im Apple-Code aktualisieren würde, ist die TastaturWillBeHidden: -Methode, um einen reibungslosen Übergang zu gewährleisten.
quelle
Hier ist eine Swift 3- kompatible Antwort, die auch mit Ansichtssteuerungen innerhalb einer Navigationssteuerung funktioniert, da sie die
contentInset.top
Eigenschaft für Bildlaufansichten ändern .quelle
Schnelle 4.2- Lösung, die mögliche Höhen von UIToolbar und UITabBar berücksichtigt.
Und wenn Sie auf <iOS 9 abzielen, müssen Sie die Registrierung des Beobachters irgendwann aufheben (danke Joe ).
quelle
Ich habe festgestellt, dass die obigen Antworten veraltet sind. Auch beim Scrollen nicht perfekt.
Hier ist eine schnelle Version.
Es wird direkt unter dem Textfeld gescrollt, kein freier Speicherplatz. Und es wird wieder so werden, wie es zuerst erschien.
quelle
Das habe ich benutzt. Es ist einfach und funktioniert gut.
Verwenden Sie den
UITextField
DelegatenaufruftextFieldDidBeginEditing:
, um Ihre Ansicht nach oben zu verschieben, und fügen Sie einen Benachrichtigungsbeobachter hinzu, um die Ansicht wieder normal zu machen, wenn die Tastatur ausgeblendet ist:quelle
Dies ist der endgültige Code mit Verbesserungen in Swift
quelle
Eine der einfachsten Lösungen ist die Verwendung des folgenden Protokolls:
Wenn Sie dieses Protokoll verwenden möchten, müssen Sie es nur anpassen und Ihre Bildlaufansicht in Ihrem Controller wie folgt zuweisen:
quelle
Ich würde das so machen. Es ist viel Code, aber es stellt sicher, dass das aktuell fokussierte Textfeld vertikal im 'verfügbaren Speicherplatz' zentriert ist:
Beachten Sie, dass die
- (IBAction)textFieldGotFocus:
Aktion mit dem Status jedes Textfelds verknüpft istDidBeginEditing
.Es wäre auch etwas besser, die Animationsdauer über die Tastaturbenachrichtigung abzurufen und diese für die Bildlaufanimation anstelle eines festen Werts zu verwenden, aber verklagen Sie mich, das war gut genug für mich;)
quelle
Verwenden Sie die folgende Erweiterung, wenn Sie nicht zu viel berechnen möchten:
Und vielleicht möchten Sie Ihr UITextField immer sichtbar halten:
quelle
Versuchen Sie diesen Code in Swift 3:
quelle
Swift 5- Lösung basierend auf der obigen Masa-Lösung - Änderungen in Bezug darauf:
keyboardFrameEndUserInfoKey
anstelle vonkeyboardFrameBeginUserInfoKey
, dakeyboardFrameBeginUserInfoKey
beim ersten Anzeigen ein anderer Wert zurückgegeben werden kann, wie hier beispielsweise beschrieben: Die Tastaturhöhe variiert beim AnzeigenUIResponder.keyboardWillShowNotification
/UIResponder.keyboardWillHideNotification
anstelle vonNSNotification.Name.UIKeyboardDidShow
/NSNotification.Name.UIKeyboardDidHide
Code:
quelle
Sie benötigen dazu eigentlich keine UIScrollView. Ich habe diesen Code verwendet und er funktioniert für mich:
quelle
Sie können mithilfe der Eigenschaft
contentOffset
in scrollenUIScrollView
, z.Es gibt auch eine Methode zum animierten Scrollen.
Der Grund, warum Ihre zweite Bearbeitung nicht richtig scrollt, kann daran liegen, dass Sie anscheinend davon ausgehen, dass bei jedem Bearbeitungsbeginn eine neue Tastatur angezeigt wird. Sie können versuchen zu überprüfen, ob Sie die sichtbare Position "Tastatur" bereits angepasst haben (und im Moment ebenfalls die Sichtbarkeit der Tastatur überprüfen, bevor Sie sie zurücksetzen).
Eine bessere Lösung könnte darin bestehen, auf die Tastaturbenachrichtigung zu warten, z.
quelle
Ich weiß, dass es jetzt eine alte Frage ist, aber ich dachte, es könnte anderen helfen. Ich wollte etwas, das für ein paar Apps, die ich hatte, etwas einfacher zu implementieren ist, also habe ich eine Klasse dafür gemacht. Sie können es hier herunterladen, wenn Sie möchten: https://github.com/sdernley/iOSTextFieldHandler
Es ist so einfach wie das Festlegen aller UITextFields, um einen Delegierten von sich selbst zu haben
Fügen Sie dies dann mit dem Namen Ihrer scrollView- und Submit-Schaltfläche zu Ihrem View-Controller hinzu
quelle
Das Folgende sind meine Lösungen, die funktionieren (5 Schritte)
Schritt 1: Fügen Sie einen Beobachter hinzu, um zu erfassen, welches UITEXTFIELD oder UITEXTVIEW ShoudBeginEditing (wo das Objekt inited ist oder ViewDidLoad).
Schritt 2: Veröffentlichen Sie eine Benachrichtigung, wenn ..ShouldBeginEditing mit OBJECT von UITEXTFIELD oder UITEXTVIEW
Schritt 3: Die Methode, die (Schritt 1) das aktuelle UITEXTFIELD oder UITEXTVIEW zuweist
Schritt 4: Hinzufügen des Tastaturbeobachters UIKeyboardWillShowNotification (gleiche Stelle wie in Schritt 1)
und Methode:
Schritt 5: Hinzufügen des Tastaturbeobachters UIKeyboardWillHideNotification (gleiche Stelle wie in Schritt 1)
und Methode:
Denken Sie daran, Beobachter zu entfernen!
quelle
Ich habe diese Antwort von Sudheer Palchuri https://stackoverflow.com/users/2873919/sudheer-palchuri https://stackoverflow.com/a/32583809/6193496 verwendet
Registrieren Sie in ViewDidLoad die Benachrichtigungen:
Fügen Sie unten Beobachtermethoden hinzu, die das automatische Scrollen ausführen, wenn die Tastatur angezeigt wird.
quelle
Meine Lösung besteht aus 4 Schritten:
- Schritt 1: Die Funktion hört zu, wenn die Tastatur angezeigt wird
- Schritt 2: Die Funktion hört zu, wenn die Tastatur verschwindet
- Schritt 3: Fügen Sie diese Funktionen zum Benachrichtigungscenter hinzu:
- Schritt 4: Listen entfernen, wenn der View Controller verschwindet
quelle