当键盘出现时,如何在可见框架的中心移动视图?

时间:2015-07-22 10:23:39

标签: ios objective-c

我在根滚动视图中嵌入了标准UIView(包含图像视图,两个文本字段和一个按钮)。我正在使用AutoLayout将UIView放在滚动视图的中心,如下面的屏幕截图所示。

Login Screenshot

我正在尝试编写一种方法,当键盘出现时向上移动UIView,以便此视图显示在较小的可见帧的中心。为实现这一目标,我计算了一些高度。

- (void)keyboardWillShow:(NSNotification *)notification {
    // Determines the size of the keyboard frame
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    [UIView animateWithDuration:0.3 animations:^{
        // Gets the root 'UIView' frame and stores it in a variable
        CGRect viewFrame = self.itemsView.frame;
        // This is the height of the visible frame once the keyboard appears
        double visibleFrameHeight = (self.view.frame.size.height - keyboardSize.height);
        // How much the 'UIView' should move up
        double offset = ((visibleFrameHeight - viewFrame.size.height / 2);
        // Moves up the 'UIView'
        viewFrame.origin.y = -offset;
        self.itemsView.frame = viewFrame;
    }];
}

问题是UIView向上移动了,如下所示。

Login Screenshot with keyboard on screen

为什么会发生这种情况,我该如何解决?

3 个答案:

答案 0 :(得分:2)

如果您的视图已嵌入UIScrollView,那么您只需调整滚动视图contentOffset即可移动视图(然后您可以免费获得动画)。

假设滚动视图在名为scrollView的插座上可用,并且您希望将视图保持居中,则可以将内容偏移量调整为键盘高度的1/2。另外 - 使用UIKeyboardFrameEndUserInfoKey获取键盘的最后一帧可能更安全:

- (void)keyboardWillShow:(NSNotification *)notification {
    // Determines the size of the keyboard frame
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
    self.scrollView.contentOffset = CGPointMake(0, keyboardSize.height / 2);
}

- (void)keyboardWillHide:(NSNotification *)notification {
    self.scrollView.contentOffset = CGPointZero;
}

答案 1 :(得分:0)

你必须在.h文件中为UIScrollView设置一个IBOutlet,如下所示: IBOutlet UIScrollView * scrLogin;

然后在 xib 文件中为 UIScrollview 和所有UiTextfield设置委托

然后在.m文件中设置此代码

您已将所有设计设置为UIimageview,UItextfield和& UIButton& UIScrollView中的所有内容。

- (void)viewDidLoad {
          [scrLogin setContentSize:CGSizeMake(320, 790)];
          [scrLogin setContentOffset:CGPointMake(0, 0) animated:YES];
    }
 #pragma mark - Textfield Delegate
 - (BOOL)textFieldShouldReturn:(UITextField *)textField {
                if (textField==txtUserName) {
                    [txtUserName resignFirstResponder];
                    [txtPsw becomeFirstResponder];
                }else{
                    [txtPsw resignFirstResponder];
                    [scrLogin setContentOffset:CGPointMake(0, -60) animated:NO];
                    //[self btnLoginTapped:self];
                }
                return YES;
            }
- (void)textFieldDidBeginEditing:(UITextField *)textField{
  if(textField==txtUserName){
        if (IS_IPHONE_4s) {
           [scrLogin setContentOffset:CGPointMake(0, 20) animated:true];
        }else{
           [scrLogin setContentOffset:CGPointMake(0, 0) animated:true];
        }
 }else if(textField==txtPsw){
    [scrLogin setContentOffset:CGPointMake(0, 40) animated:true];
 }

}

我希望它对你有所帮助。如果您有任何问题,请告诉我。

答案 2 :(得分:0)

我建议使用https://github.com/hackiftekhar/IQKeyboardManager,它易于使用并适用于整个应用程序(无需再次手动计算键盘高度)