lucgian841
lucgian841

Reputation: 2002

UITextField hidden while keyboard is showing

In my app I've this login screen:

enter image description here

Above the first test field I've an image, the configuration in Interface Builder is the follow:

enter image description here

Now when I tap on the UITextField they should move up otherwise in iPhone 4/4s the field will be covered by keyboard. Now I'm using the following code:

-(void)textFieldDidBeginEditing:(UITextField *)textField {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.35f];
    CGRect frameView = self.view.frame;
    CGRect frameImage = self.imageViewLogo.frame;
    CGRect frameTextFieldUsername = self.textFieldUsername.frame;
    CGRect frameTextFieldPassword = self.textFieldPassword.frame;
    CGRect frameButtonLogin = self.buttonLogin.frame;
    frameView.origin.y = -100;
    frameImage.origin.y = -100;
    frameTextFieldUsername.origin.y = -100;
    frameTextFieldPassword.origin.y = -100;
    frameButtonLogin.origin.y = -100;
    [self.view setFrame:frameView];
    [self.imageViewLogo setFrame:frameImage];
    [self.textFieldUsername setFrame:frameTextFieldUsername];
    [self.textFieldPassword setFrame:frameTextFieldPassword];
    [self.buttonLogin setFrame:frameButtonLogin];
    [UIView commitAnimations];
}

When I try to run the app in simulator or on a real device the view scrolls up of 100 but the image, the text fields and button doesn't scrolls up... I thought that the problem depend on the constraints, can you help me to fix this issue? Thank you

Upvotes: 0

Views: 105

Answers (5)

Tech_Intelliswift
Tech_Intelliswift

Reputation: 516

Hi the simple and easy trick for doing it is :-

Take outlet of top constraint of username or email id textfield in your class and on textfield did begin editing delegate decrease the constraint's constant value so it will goes up when u select the textfield and at textField did end editing delegate again set constraint's constant value to previous one so it will reset on previous position.

eg:-Assuming you set Top Constraint value in Storyboard is 150

-(void)textFieldDidBeginEditing:(UITextField *)textField {
   _topConstraint.constant = 10.00; 
[UIView animateWithDuration:0.5f animations:^{
                    [self.view layoutIfNeeded];
                            }];
}
-(void)textFieldDidEndEditing:(UITextField *)textField {
   _topConstraint.constant = 150.00; 
[UIView animateWithDuration:0.5f animations:^{
                    [self.view layoutIfNeeded];
                            }];
}

Hope it will help you.

Upvotes: 0

Vineesh TP
Vineesh TP

Reputation: 7973

For auto up the textFields while keyboard comes not need to use the thirdParty Classes.

Create a static tableView and design each textFields and button in each static cells. TableView automatically handle the auto up textFields while keyboard comes.

Upvotes: 0

tmpz
tmpz

Reputation: 368

If your views are set up to use AutoLayout, changing frame will do nothing.

You should subscribe to UIKeyboardWillChangeFrameNotification and perform your changes there. In case of constraints you would update the constrains constants here and the call -setNeedsUpdateConstraints on the superview.

You have to figure out if the keyboards is appearing or disappearing at all if you want to support external keyboard.

Otherwise you can listen for UIKeyboardWillShowNotification and UIKeyboardWillHideNotification

Upvotes: 0

Saif
Saif

Reputation: 2968

-(void)textFieldDidBeginEditing:(UITextField *)textField {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.35f];
    CGRect frameView = self.view.frame;
    CGRect frameImage = self.imageViewLogo.frame;
    CGRect frameTextFieldUsername = self.textFieldUsername.frame;
    CGRect frameTextFieldPassword = self.textFieldPassword.frame;
    CGRect frameButtonLogin = self.buttonLogin.frame;
    frameView.origin.y = -100;
    // no need of changing frames of TextFields inside the View, Just change the y-padding of View
    [self.view setFrame:frameView];
    [UIView commitAnimations];
}

reduce the y-padding to -120 and check

Hope this helps thanks

Upvotes: 0

Rushi
Rushi

Reputation: 4500

The way in which you are trying to do this will get you in trouble. As you are giving hardcoded values of frame.

Try to use keyboard avoiding library it's the better and safer way of doing it.

Upvotes: 4

Related Questions