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/

24voto

Um zur ursprünglichen Ansicht zurückzukehren, fügen Sie hinzu:

-(void)textFieldDidEndEditing:(UITextField *)sender

{
    //move the main view, so that the keyboard does not hide it.
    if  (self.view.frame.origin.y < 0)
    {
        [self setViewMovedUp:NO];
    }
}

23voto

Jose Muanis Punkte 547

Ich bin mir nicht sicher, ob das Verschieben der Ansicht nach oben der richtige Ansatz ist. Ich habe es auf eine andere Art und Weise, die Größe der UIScrollView. Ich habe es im Detail erklärt in ein kleiner Artikel .

3 Stimmen

Der Link zum Artikel ist tot.

21voto

Sourabh Sharma Punkte 7762

Versuchen Sie diesen kleinen Trick.

- (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 = textField.frame.origin.y / 2; // 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];
}

19voto

HotJard Punkte 4148

Es gibt so viele Lösungen, aber ich habe einige Stunden zu verbringen, bevor es beginnt funktioniert. Also, ich habe diesen Code hier (fügen Sie einfach in das Projekt, alle Änderungen müssen nicht):

@interface RegistrationViewController : UIViewController <UITextFieldDelegate>{
    UITextField* activeField;
    UIScrollView *scrollView;
}
@end

- (void)viewDidLoad
{
    [super viewDidLoad];

    scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame];

    //scrool view must be under main view - swap it
    UIView* natView = self.view;
    [self setView:scrollView];
    [self.view addSubview:natView];

    CGSize scrollViewContentSize = self.view.frame.size;
    [scrollView setContentSize:scrollViewContentSize];

    [self registerForKeyboardNotifications];
}

- (void)viewDidUnload {
    activeField = nil;
    scrollView = nil;
    [self unregisterForKeyboardNotifications];
    [super viewDidUnload];
}

- (void)registerForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillShown:)
                                                 name:UIKeyboardWillShowNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillBeHidden:)
                                                 name:UIKeyboardWillHideNotification object:nil];

}

-(void)unregisterForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:UIKeyboardWillShowNotification
                                                  object:nil];
    // unregister for keyboard notifications while not visible.
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:UIKeyboardWillHideNotification
                                                  object:nil];
}

- (void)keyboardWillShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    CGRect frame = self.view.frame;
    frame.size.height -= kbSize.height;
    CGPoint fOrigin = activeField.frame.origin;
    fOrigin.y -= scrollView.contentOffset.y;
    fOrigin.y += activeField.frame.size.height;
    if (!CGRectContainsPoint(frame, fOrigin) ) {
        CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y + activeField.frame.size.height - frame.size.height);
        [scrollView setContentOffset:scrollPoint animated:YES];
    }
}

- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
     [scrollView setContentOffset:CGPointZero animated:YES];
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    activeField = textField;
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    activeField = nil;
}

-(BOOL) textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

P.S: Ich hoffe, der Code hilft jemandem, den gewünschten Effekt schnell zu erzielen. (Xcode 4.5)

0 Stimmen

Hallo Hotjard, ich erhalte EXE_BAD_ACCESS in der [self.view addSubview:natView];

18voto

user436179 Punkte 41

@user271753

Um die ursprüngliche Ansicht wiederherzustellen, fügen Sie hinzu:

-(BOOL)textFieldShouldReturn:(UITextField *)textField{
   [textField resignFirstResponder];
   [self setViewMovedUp:NO];
   return YES;
}

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