Search This Blog

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

No comments:

Post a Comment