Search This Blog

Showing posts with label how to move textfield when keyboard appears ios. Show all posts
Showing posts with label how to move textfield when keyboard appears ios. Show all posts

Thursday, 17 April 2014

Scroll up view when keyboard appears

Hi,

Here I am about to help you to tackle the textfield or textview invisibility problem when keyboard appears on the screen.There are 2 delegate methods related to UITextfield and UITextView.You just have to move the current view up slightly to make the controls visible.

Here are the 2 delegates of UITextField.

1. Just declare  
   
          CGFloat animatedDistance;
     in viewController.h file.

2. Add these Constants as well,

          static const CGFloat KEYBOARD_ANIMATION_DURATION = 0.3;
          static const CGFloat MINIMUM_SCROLL_FRACTION = 0.2;
          static const CGFloat MAXIMUM_SCROLL_FRACTION = 0.8;
          static const CGFloat PORTRAIT_KEYBOARD_HEIGHT = 240;
          static const CGFloat LANDSCAPE_KEYBOARD_HEIGHT = 140;

3. Finally,add the UITextField delegates in your viewController.m as below,

    - (void)textFieldDidBeginEditing:(UITextField *)textField
    {    
         CGRect textFieldRect =
         [self.view.window convertRect:textField.bounds fromView:textField];
         CGRect viewRect =
         [self.view.window convertRect:self.view.bounds fromView:self.view];
         CGFloat midline = textFieldRect.origin.y + 0.5 * textFieldRect.size.height;
         CGFloat numerator =
            midline - viewRect.origin.y
           - MINIMUM_SCROLL_FRACTION * viewRect.size.height;
        CGFloat denominator =
              (MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION)
                 * viewRect.size.height;
        CGFloat heightFraction = numerator / denominator;

       if (heightFraction < 0.0){

             heightFraction = 0.0;

        }else if (heightFraction > 1.0) {

                  heightFraction = 2.0;
        }
     
        UIInterfaceOrientation orientation =
               [[UIApplication sharedApplication] statusBarOrientation];
 
        if (orientation == UIInterfaceOrientationPortrait ||
                        orientation == UIInterfaceOrientationPortraitUpsideDown)
        {
                animatedDistance = floor(PORTRAIT_KEYBOARD_HEIGHT * heightFraction);
         }
        else
        {
              animatedDistance = floor(LANDSCAPE_KEYBOARD_HEIGHT * heightFraction);
        }


        CGRect viewFrame = self.view.frame;
        viewFrame.origin.y -= animatedDistance;
    
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
    
        [self.view setFrame:viewFrame];
    
        [UIView commitAnimations];
    }


    - (void)textFieldDidEndEditing:(UITextField *)textField
    {
    
        if(self.view.frame.origin.y == 0)
              return;
    
        if (animatedDistance == 0.0)
             return;
    
         CGRect viewFrame = self.view.frame;
         viewFrame.origin.y += animatedDistance;
    
         [UIView beginAnimations:nil context:NULL];
         [UIView setAnimationBeginsFromCurrentState:YES];
         [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
    
         [self.view setFrame:viewFrame];
    
         [UIView commitAnimations];
    
         animatedDistance = 0.0;

     }

You are done !

For UITextView you have to replace above delegate methods with

- (void)textViewDidBeginEditing:(UITextView *)textVield and
- (void)textViewDidEndEditing:(UITextView *)textView

respectively.



Feel free to comment. Thanks :)