键盘显示时更改自动布局常量

Posted

技术标签:

【中文标题】键盘显示时更改自动布局常量【英文标题】:change autolayout constant when keyboard shows 【发布时间】:2016-08-31 18:22:04 【问题描述】:

我有一个 TopContainer 视图,然后是一个 Scrollview,然后又是一个 BottomContainer 视图。

现在的限制是滚动视图的顶部到 topContainer 的底部,并且滚动视图的底部到底部容器的顶部。

当我启动视图控制器并查看视图层次结构时,它很好。

但是当键盘显示时,我想修改自动布局约束,以便底部容器向上移动。

所以我想我像这样保存约束并更改常量:

private var toolbarBottomConstraint: NSLayoutConstraint?
self.toolbarBottomConstraint = self.toolbar.autoPinEdgeToSuperviewEdge(.Bottom, withInset: 0)

然后当键盘弹出时我这样做:

func keyboardWillShow(notification:NSNotification)
    var userInfo = notification.userInfo!
    var keyboardFrame:CGRect = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).CGRectValue()
    keyboardFrame = self.view.convertRect(keyboardFrame, fromView: nil)

    self.toolbarBottomConstraint?.constant = keyboardFrame.size.height

这没有任何作用。键盘高度正是底部需要在键盘顶部的偏移量。

为什么视图没有改变?我总是这样改变常数,它总是有效的。我是否需要做一些特别的事情,因为它现在使用键盘。

【问题讨论】:

【参考方案1】:

如果您正在为 ios 9 或更高版本构建,我写了一个simple library,它负责在键盘出现时自动调整视图。它非常灵活,应该可以无缝运行。

如果您仍想自己滚动,您似乎还没有在任何地方为通知添加侦听器。在将消息发送到 keyboardWillShow(_:) 方法之前,您需要这样做。

【讨论】:

【参考方案2】:

您是否尝试在设置约束后调用setNeedsLayout()?:

self.toolbarBottomConstraint?.constant = keyboardFrame.size.height
self.view.setNeedsLayout()

【讨论】:

我已经尝试过了,但它不起作用。我需要在另一个视图上执行此操作吗? 我猜应该是self.view.layoutIfNeeded() 而不是setNeedsLayout。如果它仍然不起作用,您应该检查约束,您正在更改的约束应该是从视图控制器的视图连接到滚动视图的约束。

以上是关于键盘显示时更改自动布局常量的主要内容,如果未能解决你的问题,请参考以下文章

如何设置自动布局约束常量通用或设备特定?

如何在 UIWebView 上的键盘上方显示工具栏 [关闭]

在运行时更改自动布局

如何在 ios 中使用自动布局更改滚动视图内容大小

更改方向的自动布局约束

键盘显示和隐藏上的动画自动布局约束