1792 Stimmen

Wie kann ich ein UITextField nach oben bewegen, wenn die Tastatur vorhanden ist - beim Start der Bearbeitung?

Mit dem iOS SDK:

Ich habe eine UIView con UITextField s, die eine Tastatur aufrufen. Ich brauche es in der Lage zu sein:

  1. Erlaubt das Scrollen des Inhalts der UIScrollView um die anderen Textfelder zu sehen, sobald die Tastatur eingeblendet wird

  2. Automatisches "Springen" (durch Scrollen nach oben) oder Verkürzen

Ich weiß, dass ich eine UIScrollView . Ich habe versucht, die Klasse meiner UIView を、その UIScrollView aber ich kann die Textfelder immer noch nicht nach oben oder unten verschieben.

Benötige ich sowohl eine UIView und eine UIScrollView ? Passt das eine in das andere?

Was muss implementiert werden, um automatisch zum aktiven Textfeld zu blättern?

Idealerweise wird die Einrichtung der Komponenten so weit wie möglich im Interface Builder vorgenommen. Ich möchte nur Code für das schreiben, was ich brauche.

Anmerkung: Die UIView (o UIScrollView ), mit dem ich arbeite, wird über eine Registerkartenleiste angezeigt ( UITabBar ), die wie gewohnt funktionieren muss.


Ich füge die Bildlaufleiste nur dann hinzu, wenn die Tastatur angezeigt wird. Auch wenn es nicht benötigt wird, habe ich das Gefühl, dass es eine bessere Schnittstelle bietet, weil der Benutzer dann scrollen und Textfelder ändern kann, zum Beispiel.

Ich habe es so hinbekommen, dass ich die Rahmengröße der UIScrollView wenn die Tastatur auf und ab geht. Ich benutze einfach:

-(void)textFieldDidBeginEditing:(UITextField *)textField {
    //Keyboard becomes visible
    scrollView.frame = CGRectMake(scrollView.frame.origin.x,
                                  scrollView.frame.origin.y,
    scrollView.frame.size.width,
    scrollView.frame.size.height - 215 + 50);   // Resize
}

-(void)textFieldDidEndEditing:(UITextField *)textField {
    // Keyboard will hide
    scrollView.frame = CGRectMake(scrollView.frame.origin.x,
                                  scrollView.frame.origin.y,
                                  scrollView.frame.size.width,
                                  scrollView.frame.size.height + 215 - 50); // Resize
}

Allerdings werden dadurch die unteren Textfelder nicht automatisch nach oben verschoben oder im sichtbaren Bereich zentriert, was ich eigentlich gerne hätte.

0 Stimmen

Sie können das Textfeld animieren, so dass sich das Textfeld bewegt, wenn die Tastatur hochkommt

7 Stimmen

Sehen Sie sich das an. Kein Ärger für Sie. TPKeyboardVermeiden

24 Stimmen

Das ist von Apple dokumentiert, und ich denke, das ist der beste Weg: developer.apple.com/library/ios/#documentation/StringsTextFonts/

49voto

Jonathan Sterling Punkte 18133

Eine Überlegung ist, ob Sie jemals eine UITextField selbständig. Ich habe noch keine gut durchdachten iPhone-Apps gefunden, die tatsächlich UITextFields außerhalb von UITableViewCells .

Es wird etwas zusätzliche Arbeit sein, aber ich empfehle Ihnen, alle Dateneingabeansichten als Tabellenansichten zu implementieren. Hinzufügen einer UITextView zu Ihrem UITableViewCells .

1 Stimmen

Eine meiner Anwendungen muss es Benutzern ermöglichen, Freiform-Notizen hinzuzufügen - also ja, manchmal ist es nützlich, ein UITextField zu verwenden.

1 Stimmen

Ich bin mit dieser Methode einverstanden. Null Arbeit oder Code auf diese Weise. Selbst wenn Sie eine Freiform-Notiz benötigen, können Sie immer noch mit einer Tabellenzelle

0 Stimmen

UITableView ist leider der einzige Weg, den wir gehen können. Tastaturbenachrichtigungen sind spröde und haben sich im Laufe der Zeit verändert. Beispielcode auf Stack Overflow: stackoverflow.com/a/32390936/218152

48voto

Mihai Damian Punkte 10906

Diese Dokument wird eine Lösung für dieses Problem beschrieben. Schauen Sie sich den Quellcode unter 'Moving Content That Is Located Under the Keyboard' an. Es ist ziemlich einfach.

EDIT: Ich habe bemerkt, dass das Beispiel eine kleine Panne hat. Sie werden wahrscheinlich auf Folgendes hören wollen UIKeyboardWillHideNotification anstelle von UIKeyboardDidHideNotification . Andernfalls wird die Bildlaufansicht hinter der Tastatur für die Dauer der Animation zum Schließen der Tastatur abgeschnitten.

33voto

Zar E Ahmer Punkte 32557

Einfachste Lösung gefunden

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self animateTextField: textField up: YES];
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self animateTextField: textField up: NO];
}

- (void) animateTextField: (UITextField*) textField up: (BOOL) up
{
    const int movementDistance = 80; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? -movementDistance : movementDistance);

    [UIView beginAnimations: @"anim" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];
}

0 Stimmen

Der Bildschirm bewegt sich nach oben, auch wenn er sich nicht am unteren Rand befindet, d.h. wenn sich das Textfeld oben befindet, bewegt es sich aus dem Bildschirm heraus. Wie kann man diesen Fall kontrollieren?

0 Stimmen

@MELWIN Einfach nach dieser Zeile hinzufügen: int movement = (up ? -movementDistance : movementDistance); if (textField.frame.origin.y < self.view.frame.size.height - keyboard.height) { movementDistance = 0 } Bitte beachten Sie, dass die keyboard Variable ist der CGRect der Tastatur, die aufpoppt, die Sie erhalten, indem Sie tun: let keyboard = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey]!.CGRe‌​ctValue())!

32voto

tt.Kilew Punkte 5784

Eine kleine Korrektur, die für viele UITextFields funktioniert:

#pragma mark UIKeyboard handling

#define kMin 150

-(void)textFieldDidBeginEditing:(UITextField *)sender
{
    if (currTextField) {
        [currTextField release];
    }
    currTextField = [sender retain];
    // Move the main view, so that the keyboard does not hide it.
    if (self.view.frame.origin.y + currTextField.frame.origin. y >= kMin) {
        [self setViewMovedUp:YES];
    }
}

// Method to move the view up/down whenever the keyboard is shown/dismissed
-(void)setViewMovedUp:(BOOL)movedUp
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3]; // If you want to slide up the view

    CGRect rect = self.view.frame;
    if (movedUp)
    {
        // 1. move the view's origin up so that the text field that will be hidden come above the keyboard
        // 2. increase the size of the view so that the area behind the keyboard is covered up.
        rect.origin.y = kMin - currTextField.frame.origin.y ;
    }
    else
    {
        // Revert back to the normal state.
        rect.origin.y = 0;
    }
    self.view.frame = rect;

    [UIView commitAnimations];
}

- (void)keyboardWillShow:(NSNotification *)notif
{
    // Keyboard will be shown now. Depending on which textfield is active, move up or move down the view appropriately

    if ([currTextField isFirstResponder] && currTextField.frame.origin.y + self.view.frame.origin.y >= kMin)
    {
        [self setViewMovedUp:YES];
    }
    else if (![currTextField isFirstResponder] && currTextField.frame.origin.y + self.view.frame.origin.y < kMin)
    {
        [self setViewMovedUp:NO];
    }
}

- (void)keyboardWillHide:(NSNotification *)notif
{
    // Keyboard will be shown now. Depending on which textfield is active, move up or move down the view appropriately
    if (self.view.frame.origin.y < 0 ) {
        [self setViewMovedUp:NO];
    }
}

- (void)viewWillAppear:(BOOL)animated
{
    // Register for keyboard notifications
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:)
                                                 name:UIKeyboardWillShowNotification object:self.view.window];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:)
                                                 name:UIKeyboardWillHideNotification object:self.view.window];
}

- (void)viewWillDisappear:(BOOL)animated
{
    // Unregister for keyboard notifications while not visible.
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
}

0 Stimmen

rect.origin.y=+currTextField.frame.origin.y funktioniert einwandfrei Danke

31voto

Steve Punkte 1179

Der Code von RPDP bewegt das Textfeld erfolgreich aus dem Weg der Tastatur. Wenn Sie jedoch nach der Verwendung und dem Verlassen der Tastatur nach oben scrollen, wurde der obere Bereich aus der Ansicht gescrollt. Dies gilt sowohl für den Simulator als auch für das Gerät. Um den Inhalt am oberen Rand der Ansicht zu lesen, muss man die Ansicht neu laden.

Sollte der folgende Code nicht die Ansicht wieder nach unten bringen?

else
{
    // revert back to the normal state.
    rect.origin.y += kOFFSET_FOR_KEYBOARD;
    rect.size.height -= kOFFSET_FOR_KEYBOARD;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X