animating text box when clicked

2019-05-30 13:28发布

问题:

I am trying to move a text box from the bottom of the screen in an iPad app so that the keyboard does not cover it.

I have the following which works.

-(void) textViewDidBeginEditing:(UITextView *) observationComment
{
observationComment.frame=CGRectMake(190, 100, 700, 250);
}

But 1 - I would like to animate the movement - is this possible?

2 - I get a warning

Local declaration of 'observationComment' hides instance variable

Any advice? Maybe this is not the best way to do it.

回答1:

I previously found the answer here, but I had to add code so that the View Controller's view.frame adjusts when the user switches between keyboards (like international or emoji) by pressing the globe key ().

In YourViewController.h, store the height of the keyboard (only when it's visible) in an instance variable.

@interface YourViewController : UIViewController {
    CGFloat keyboardHeightIfShowing ;
}

In YourViewController.m, implement these methods.

- (void) keyboardWillShow:(NSNotification*)notification {
    [self moveTextViewForKeyboard:notification up:YES] ;
}

- (void) keyboardWillHide:(NSNotification*)notification {
    [self moveTextViewForKeyboard:notification up:NO] ;
}

- (void) moveTextViewForKeyboard:(NSNotification*)notification up:(BOOL)up {
    NSDictionary* userInfo = [notification userInfo] ;
    UIViewAnimationCurve animationCurve ;
    NSTimeInterval animationDuration ;
    CGRect keyboardEndFrame ;

    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve] ;
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration] ;
    [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame] ;

    [UIView beginAnimations:nil context:nil] ;
    [UIView setAnimationDuration:animationDuration] ;
    [UIView setAnimationCurve:animationCurve] ;

    CGRect keyboardFrame = [self.view convertRect:keyboardEndFrame toView:nil] ;
    //Since I have a UITabBar, when the keyboard appears, self.view.frame.height should shrink by slightly less than if I did not have a UITabBar.
    keyboardFrame.size.height -= self.tabBarController.tabBar.frame.size.height ;
    CGRect newViewFrame = self.view.frame ;
    //UIKeyboardWillShowNotification can be triggered even when the keyboard is already showing, such as when switching between certain international keyboards. When this happens, before shrinking newViewFrame to accommodate keyboardFrame, enlarge newViewFrame so that it is the size it was before the previous keyboard appeared.
    if ( up && keyboardHeightIfShowing ) {
        NSLog(@"hiding keyboard with height %0.1f, showing keyboard with height %0.1f",keyboardHeightIfShowing, keyboardFrame.size.height) ;
        newViewFrame.size.height += keyboardHeightIfShowing ;
    }
    newViewFrame.size.height -= keyboardFrame.size.height * (up ? 1 : -1) ;
    keyboardHeightIfShowing = ( up ? keyboardFrame.size.height : 0 ) ;
    self.view.frame = newViewFrame ;

    [UIView commitAnimations] ;
}

And finally, in YourViewController.m, establish keyboardWillShow and keyboardWillHide to be called by UIKeyboardWillShow/Hide notifications.

- (void) viewWillAppear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil] ;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil] ;
}

- (void) viewWillDisappear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil] ;
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil] ;
}


回答2:

Take a look at this tutorial or this stackoverflow.com question and its answers. It's a complicated issue but these should give you a better idea of what you need to do.