Ich habe Beiträge um hier gesehen - die darauf schließen lassen, dass UIScrollViews
automatisch einen Bildlauf durchführen soll, wenn eine Unteransicht UITextField
der erste Responder ist; Ich kann jedoch nicht herausfinden, wie ich das erreichen kann.
Was ich habe, ist ein UIViewController
, der ein UIScrollView
hat, und innerhalb des UIScrollView
gibt es mehrere Textfelder.
Ich kann dies manuell tun, wenn nötig; Nach dem, was ich gelesen habe, scheint es jedoch möglich zu sein, es automatisch zu scrollen. Hilfe bitte.
Ich hoffe, dieses Beispiel wird Ihnen helfen. Sie können mit diesem Code an jeden beliebigen Punkt blättern.
scrollView.contentOffset = CGPointMake(0,0);
Wenn Sie also ein Textfeld haben, muss es eine x- und y-Position haben, damit Sie es verwenden können
CGPoint point = textfield.frame.Origin ;
scrollView.contentOffset = point
Das sollte den Trick tun,
Wenn Sie jedoch nicht wissen, wann Sie diesen Code aufrufen sollen, sollten Sie die Methoden UITextFieldDelegate kennenlernen
Implementieren Sie diese Methode in Ihrem Code
- (void)textFieldDidBeginEditing:(UITextField *)textField {
// Place Scroll Code here
}
Ich hoffe, Sie wissen, wie Sie Delegiermethoden verwenden.
Ich weiß, dass diese Frage bereits beantwortet wurde, aber ich dachte, ich würde die Codekombination, die ich von @Adeel und @Basil verwendet habe, mitteilen, da sie auf iOS 9 perfekt zu funktionieren scheint.
-(void)textFieldDidBeginEditing:(UITextField *)textField {
// Scroll to the text field so that it is
// not hidden by the keyboard during editing.
[scroll setContentOffset:CGPointMake(0, (textField.superview.frame.Origin.y + (textField.frame.Origin.y))) animated:YES];
}
-(void)textFieldDidEndEditing:(UITextField *)textField {
// Remove any content offset from the scroll
// view otherwise the scroll view will look odd.
[scroll setContentOffset:CGPointMake(0, 0) animated:YES];
}
Ich habe auch die animierte Methode verwendet, sie macht den Übergang viel ruhiger.
Sie müssen nichts manuell tun. Es ist das Standardverhalten. Es gibt zwei Möglichkeiten, warum Sie das Verhalten nicht sehen
UITextField
abdeckt. Lösung siehe untenUIScrollView
in der Ansichtshierarchie zwischen der UITextField
und der UIScrollView
haben, die Sie automatisch scrollen möchten. Dies ist weniger wahrscheinlich, kann jedoch zu Problemen führen.Für # 1 möchten Sie etwas implementieren, das den Empfehlungen von Apple für Moving Content unter der Tastatur ähnelt. Beachten Sie, dass der von Apple bereitgestellte Code die Rotation nicht berücksichtigt. Um Verbesserungen an ihrem Code zu erhalten, lesen Sie die Implementierung der keyboardDidShow
-Methode von dieses Blogposts durch, die den Frame der Tastatur mithilfe des Fensters korrekt übersetzt.
- (void)textFieldDidBeginEditing:(UITextField *)textField {
CGRect rect = [textField bounds];
rect = [textField convertRect:rect toView:self.scrollView];
rect.Origin.x = 0 ;
rect.Origin.y -= 60 ;
rect.size.height = 400;
[self.scrollView scrollRectToVisible:rect animated:YES];
}
Sie können diese Funktion für die AutoScroll von UITextField verwenden
auf UITextFieldDelegate
- (void)textFieldDidBeginEditing:(UITextField *)textField {
[self autoScrolTextField:textField onScrollView:self.scrollView];
}
- (void) autoScrolTextField: (UITextField *) textField onScrollView: (UIScrollView *) scrollView {
float slidePoint = 0.0f;
float keyBoard_Y_Origin = self.view.bounds.size.height - 216.0f;
float textFieldButtomPoint = textField.superview.frame.Origin.y + (textField.frame.Origin.y + textField.frame.size.height);
if (keyBoard_Y_Origin < textFieldButtomPoint - scrollView.contentOffset.y) {
slidePoint = textFieldButtomPoint - keyBoard_Y_Origin + 10.0f;
CGPoint point = CGPointMake(0.0f, slidePoint);
scrollView.contentOffset = point;
}
EDIT:
Ich benutze jetzt IQKeyboardManager Wenn der Entwickler davon überzeugt ist, müssen Sie dies versuchen.
Hier ist das Swift 4-Update für @ Supertecnoboffs Antwort. Es hat großartig für mich funktioniert.
func textFieldDidBeginEditing(_ textField: UITextField) {
scroll.setContentOffset(CGPoint(x: 0, y: (textField.superview?.frame.Origin.y)!), animated: true)
}
func textFieldDidEndEditing(_ textField: UITextField) {
scroll.setContentOffset(CGPoint(x: 0, y: 0), animated: true)
}
Stellen Sie sicher, dass Sie UITextFieldDelegate erweitern, und setzen Sie den Delegaten der Textfelder auf self.
Wenn Sie über mehrere Textfelder verfügen, sagen Sie Textfield1
, Textfield2
, Textfield3
und Sie möchten die Bildlaufansicht entlang der y-Achse scrollen, wenn textfield2 der erste Ansprechpartner ist:
if([Textfield2 isFirstResponder])
{
scrollView.contentOffset = CGPointMake(0,yourY);
}
Wie Michael McGuire in Punkt 2 oben erwähnt, verhält sich das Standardverhalten des Systems falsch, wenn die Bildlaufansicht eine weitere Bildlaufansicht zwischen dem Textfeld und der Bildlaufansicht enthält. Ich habe festgestellt, dass das Fehlverhalten auch auftritt, wenn eine Bildlaufansicht lediglich next für das Textfeld vorhanden ist (beide eingebettet in die Bildlaufansicht), die angepasst werden muss, um das Textfeld anzuzeigen, wenn das Textfeld beginnen möchte Bearbeiten. Dies ist auf iOS 12.1.
Aber meine Lösung unterscheidet sich von den oben genannten. In meiner Scroll-Ansicht der obersten Ebene, die untergeordnet ist, sodass ich Eigenschaften hinzufügen und Methoden überschreiben kann, überschreibe ich scrollRectToVisible:animated:
. Es ruft einfach seinen [super scrollRectToVisible:animated:]
auf, es sei denn, es gibt einen Eigenschaftensatz, der ihn anweist, das übergebene rect
anzupassen, das den Rahmen des Textfelds darstellt. Wenn die Eigenschaft nicht null ist, handelt es sich um einen Verweis auf das betreffende UITextField
, und das rect
wird so angepasst, dass die Bildlaufansicht weiter geht, als das System erwartet. Also habe ich dies in die untergeordnete Header-Datei von UIScrollView
eingefügt:
@property (nullable) UITextField *textFieldToBringIntoView;
(mit passendem @synthesize textFieldToBringIntoView;
in der Implementierung. Dann habe ich die Override-Methode der Implementierung hinzugefügt:
- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)how
{
if (textFieldToBringIntoView) {
// Do whatever mucking with `rect`'s Origin needed to make it visible
// based on context or its spatial relationship with the other
// view that the system is getting confused by.
textFieldToBringIntoView = nil; // Go back to normal
}
[super scrollRectToVisible:rect animated:how];
}
Setzen Sie in der Delegat-Methode für UITextField
für den Beginn der Bearbeitung einfach textFieldToBringIntoView
auf das betreffende textField
:
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
// Ensure it scrolls into view so that keyboard doesn't obscure it
// The system is about to call |scrollRectIntoView:| for the scrolling
// superview, but the system doesn't get things right in certain cases.
UIScrollView *parent = (UIScrollView *)textField.superview;
// (or figure out the parent UIScrollView some other way)
// Tell the override to do something special just once
// based on this text field's position in its parent's scroll view.
parent.textFieldToBringIntoView = textField;
// The override function will set this back to nil
return(YES);
}
Es scheint zu funktionieren. Und wenn Apple den Fehler behebt, scheint es, als könnte es noch funktionieren (Daumen drücken).