键盘带有Uitextfield的许多子视图上下移动



我需要上下移动键盘。我有许多带有许多Uitextfields的子视图。这些子视图有一个超级视图,此Supperiew在滚动视图中。

我无法使用以下代码向上移动视图:

- (void) keyboardWasShown:(NSNotification *)notification{
    NSDictionary *info = [notification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey]CGRectValue].size;
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0);
    self.Scroll_view.contentInset = contentInsets;
    self.Scroll_view.scrollIndicatorInsets = contentInsets;
}
- (void) keyboardWillBeHidden:(NSNotification *)notification{
   UIEdgeInsets contentInsets = UIEdgeInsetsZero;
   self.Scroll_view.contentInset = contentInsets;
   self.Scroll_view.scrollIndicatorInsets = contentInsets;
}

当我将所有uitextfields放在scrollview(不在子视图中)时,此代码正常工作,但是我需要与子视图进行操作,并且还可以上下移动键盘。在按下键盘下一个/返回键时,如何上下移动键盘?

尝试以下:

- (void)animateViewUpToTargetYOrigin:(CGFloat)yValue
{
    [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardDidChangeFrameNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
        CGFloat yOrigin = 0;
        CGFloat keyboardYOrigin = [[[note userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].origin.y;
        if (yValue > keyboardYOrigin) {
            yOrigin = yValue - keyboardYOrigin;
        }
        [UIView animateWithDuration:0.3f animations:^{
                self.view.frame = CGRectMake(self.frame.origin.x, -yOrigin, self.frame.size.width, self.frame.size.height);

        }];

}];

使用此代码,您只需要在TextField didBeediting中调用此方法,然后将Yorigin(Textfield) Height(TextField)作为y值传递。如果您在scrollview中或任何sub视图在发送y值之前将其帧值转换为self。

例如:

CGRect textFieldRectWithRespectToSelfView = [textField.superview convertRect:textField.frame toView:self.view];
[self.view animateViewUpToTargetYOrigin: textFieldRectWithRespectToSelfView.orgin.y + textFieldRectWithRespectToSelfView.size.height];

调用[textField resignFirstResponder]时,self.view返回其原始位置。发生这种情况是因为UIKeyboardDidChangeFrameNotification始终不断听键盘框架更改。

我确实在GitHub中有一个演示项目,请参考:

https://github.com/subhajitregor/viewmoveupexample

viewDidLoad方法

- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                              selector:@selector(keyboardWillShow:)
                                                  name:UIKeyboardWillShowNotification
                                                object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                              selector:@selector(keyboardWillHide:)
                                                  name:UIKeyboardWillHideNotification
                                                object:nil];
}
- (void)keyboardWillHide:(NSNotification *)aNotification
{
     // the keyboard is hiding reset the table's height
     NSTimeInterval animationDuration =
     [[[aNotification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
     CGRect frame = self.view.frame;
     frame.origin.y += 150;
     [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
     [UIView setAnimationDuration:animationDuration];
     self.view.frame = frame;
     [UIView commitAnimations];
 }
- (void)keyboardWillShow:(NSNotification *)aNotification
{
     // the keyboard is showing so resize the table's height
     NSTimeInterval animationDuration =
     [[[aNotification userInfo]     objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
     CGRect frame = self.view.frame;
     frame.origin.y -= 150;
     [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
     [UIView setAnimationDuration:animationDuration];
     self.view.frame = frame;
     [UIView commitAnimations];
}

最新更新