转移键盘内容时,安全区域边界不起作用

时间:2019-05-31 17:31:46

标签: ios swift interface-builder ios-autolayout safearealayoutguide

我创建了一个视图控制器,该控制器在当前上下文中以模态显示。它由一个半透明的外部视图(覆盖整个显示区域)和一个不透明的内部视图(包含实际内容)组成-给出对话框的外观。外部容器遵守根视图的安全区域边距。

部分内容是文本视图,为了使用户能够舒适地输入文本,我正在使用类似的方法

self.view.frame = self.view.frame.offsetBy(dx: 0, dy: offset)

上下移动由键盘事件触发的根视图。由于我描述的问题似乎与特定的偏移量无关,因此这里省略了偏移量的计算。

当我反复出现和消失键盘时,发生的是内容超出了安全区域范围,然后又移回了安全范围。似乎我在某种程度上错误地使用了安全区域边界但我一直无法弄清楚为什么。发生了什么,正确的方法是什么?

下面是我的视图控制器布局的屏幕截图,包括约束,以及一些显示内容边界变化的屏幕截图。

view controller

correct boundaries

correct boundaries with keyboard

content outside safe area

content outside safe area with keyboard

1 个答案:

答案 0 :(得分:1)

您可以使用UnderKeyboard库来实现这一目标。

因此,我强烈建议您在打开键盘后使用UIScrollView来移动内容。跟随this guide

或者使用AutoLayout底部约束进行底部填充并设置其常量的动画效果。

示例:

@IBOutlet var bottomConstraint: NSLayoutConstraint!

override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "animateWithKeyboard:", name: UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "animateWithKeyboard:", name: UIKeyboardWillHideNotification, object: nil)
}

func animateWithKeyboard(notification: NSNotification) {

    let userInfo = notification.userInfo!
    let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue().height
    let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as! Double
    let curve = userInfo[UIKeyboardAnimationCurveUserInfoKey] as! UInt
    let moveUp = (notification.name == UIKeyboardWillShowNotification)

    bottomConstraint.constant = moveUp ? -keyboardHeight : 0

    let options = UIViewAnimationOptions(rawValue: curve << 16)
    UIView.animateWithDuration(duration, delay: 0, options: options, animations: {
        self.view.layoutIfNeeded()
    },
    completion: nil)
}