有关如何更改自定义键盘高度的SO答案。其中一些工作例如here,但那些工作导致约束冲突错误打印到控制台输出:
Unable to simultaneously satisfy constraints...
Will attempt to recover by breaking constraint...
这是我设置自定义键盘高度的非常简单的键盘控制器(是Swift):
class KeyboardViewController: UIInputViewController {
private var heightConstraint: NSLayoutConstraint?
private var dummyView: UIView = UIView()
override func updateViewConstraints() {
super.updateViewConstraints()
if self.view.frame.size.width == 0 || self.view.frame.size.height == 0 || heightConstraint == nil {
return
}
inputView.removeConstraint(heightConstraint!)
heightConstraint!.constant = UIInterfaceOrientationIsLandscape(self.interfaceOrientation) ? 180 : 200
inputView.addConstraint(heightConstraint!)
}
override func viewDidLoad() {
super.viewDidLoad()
self.dummyView.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(self.dummyView)
view.addConstraint(NSLayoutConstraint(item: self.dummyView, attribute: .Left, relatedBy: .Equal, toItem: self.view, attribute: .Left, multiplier: 1.0, constant: 0.0))
view.addConstraint(NSLayoutConstraint(item: self.dummyView, attribute: .Bottom, relatedBy: .Equal, toItem: self.view, attribute: .Bottom, multiplier: 1.0, constant: 0.0))
heightConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 0.0)
}
}
这会产生恼人的输出错误,我在heightConstraint
中添加的约束updateViewConstraints
与标识为UIView-Encapsulated-Layout-Height
的约束冲突。
我尝试删除UIView-Encapsulated-Layout-Height
中的冲突常量(updateViewConstraints
),如下所示:
let defaultHeightConst = inputView.constraints().filter() {c in (c as? NSLayoutConstraint)?.identifier == "UIView-Encapsulated-Layout-Height"}.first as? NSLayoutConstraint
if defaultHeightConst != nil {
inputView.removeConstraint(defaultHeightConst!
}
这没有帮助,输出警告仍然存在。我该如何解决这个问题?具体来说,我该怎么做才能摆脱输出错误信息?
答案 0 :(得分:4)
尝试将heightConstraint优先级设置为小于1000.有点像打击:
heightConstraint.priority = 990
OR
heightConstraint.priority = 999
答案 1 :(得分:1)
此警告在iOS 13中仍然是一个问题。
它的出现是因为键盘扩展名(KeyboardViewController
的{{1}}属性)将自动调整大小的掩码转换为约束。
您要调用的是删除自动生成的高度约束
view
但是,这还不够:您必须替换重要的生成约束。
我在view.translatesAutoresizingMaskIntoConstraints = false
函数中执行了此操作,因为此时存在父视图。我使用viewWillAppear
属性来避免多次添加相同的约束,因为该函数可以重复调用。
constraintHaveBeenAdded
您甚至可以删除高度限制,让子视图限制决定键盘高度。