webentwicklung-frage-antwort-db.com.de

So machen Sie ein UIScrollView-Bildlauf automatisch, wenn ein UITextField zum ersten Responder wird

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.

25
Nosrettap

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.

30
Adeel Pervaiz

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.

10
Supertecnoboff

Sie müssen nichts manuell tun. Es ist das Standardverhalten. Es gibt zwei Möglichkeiten, warum Sie das Verhalten nicht sehen

  1. Der wahrscheinlichste Grund ist, dass die Tastatur Ihre UITextField abdeckt. Lösung siehe unten
  2. Die andere Möglichkeit ist, dass Sie eine andere UIScrollView 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.

6
Michael McGuire
- (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];
}
4
George

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.

3
Basil Mariano

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.

2
donmiller

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);
} 
1
Deep Batra

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).

0
jsbox