为什么键盘和键盘出现时视图之间存在差距

时间:2018-02-05 15:46:16

标签: ios objective-c uiview autolayout

结构:

的UIView

  

基本视角

自动版式

  
      
  1. 中心X
  2.   
  3. 中心Y
  4.   
  5. 等宽度到SafeView
  6.   
  7. SafeView的平等高度
  8.   

的UIView

  

InnerView(BaseView的子视图)

自动版式

  
      
  1. 领导
  2.   
  3. 尾随
  4.   
  5.   
  6. 底部(创建名为“bottomLayoutConstraint”的IBOutLet)
  7.   
    - (void)keyBoardWillShow:(NSNotification *)notification {

        NSDictionary *info  = notification.userInfo;
        NSValue      *value = info[UIKeyboardFrameEndUserInfoKey];
        CGRect rawFrame      = [value CGRectValue];
        CGRect keyboardFrame = [self.view convertRect:rawFrame fromView:nil];
        self.bottomLayoutConstraint.constant = CGRectGetHeight(keyboardFrame);
[self.view layoutIfNeeded];

    }

    - (void)keyBoardWillHide:(NSNotification *)notification {

        self.bottomLayoutConstraint.constant = 0.0;

    }

键盘出现时,为什么KeyboardInnerView之间存在差距?

enter image description here

修改

应用Aleksander Maj的解决方案后,差距缩小到5px

enter image description here

修改

这是我的View层次结构截图

enter image description here

1 个答案:

答案 0 :(得分:2)

CGRectGetHeight(keyboardFrame)返回从屏幕底边计算的键盘高度。同时,您的bottomLayoutConstraint固定在 BaseView的安全区域的底边(与屏幕的下边缘不同) 。这两个水平向导之间的差异是你的差距的高度。 您应该按以下方式计算bottomLayoutConstraint的常量:

if (@available(iOS 11, *)) {
  self.bottomLayoutConstraint.constant = CGRectGetHeight(keyboardFrame) - self.view.safeAreaInsets.bottom
} else {
  self.bottomLayoutConstraint.constant = CGRectGetHeight(keyboardFrame)
}

至少我怀疑的是这个。我没有重现你的视图层次结构。

编辑:

您可以粘贴视图层次结构的屏幕截图(扩展了所有约束)吗?我认为你的5pt差距问题可能与不正确的约束常数值有关。

View hierarchy

编辑2:

Safe Area's centerY