UIView的高度限制会打破子视图的高度约束

时间:2017-12-02 23:51:55

标签: ios swift uiview autolayout inputaccessoryview

我有一个非常简单的设置,我无法做我想做的事。

我试图添加inputAccessoryView

对于inputAccessoryView,我有UIView ViewA )并带有子视图( ViewB )。 ViewB 固定在 ViewA 的所有边缘。 ViewB 具有固定的高度,需要是 ViewA ViewB 的高度。

ViewA 并非由我设置,但0打破了 ViewB 的高度(设置为42)

ViewA 作为子视图添加到UIViewController的视图中,并固定在底部以及前缘和后缘(因此 ViewA <的宽度/ strong>和 ViewB 应该是UIViewController的视图,它是。)

这是我的代码:

override init(frame: CGRect) {
    super.init(frame: frame)

    let viewB = UIView()
    addSubview(viewB)

    viewB.translatesAutoresizingMaskIntoConstraints = false
    viewB.topAnchor.constraint(equalTo: topAnchor).isActive = true
    viewB.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
    viewB.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
    viewB.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
    viewB.heightAnchor.constraint(equalToConstant: 42).isActive = true
}

导致以下错误:

2017-12-02 15:44:59.150228-0800 Ping[37511:5808904] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
    (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x608000283b60 h=--& v=--& MyApp.ViewA:0x7fe606511360.height == 0   (active)>",
    "<NSLayoutConstraint:0x608000282030 UIView:0x7fe606511550.height == 42   (active)>",
    "<NSLayoutConstraint:0x608000281d60 V:|-(0)-[UIView:0x7fe606511550]   (active, names: '|':MyApp.ViewA:0x7fe606511360 )>",
    "<NSLayoutConstraint:0x608000281ef0 UIView:0x7fe606511550.bottom == MyApp.ViewA:0x7fe606511360.bottom   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x608000282030 UIView:0x7fe606511550.height == 42   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

ViewA 设置非常简单:

extension MessageViewController {

    open override var canBecomeFirstResponder: Bool {
        return true
    }

    open override var inputAccessoryView: UIView? {
        return messageInputView
    }

}

为什么我从未设置的 ViewA 高度会破坏我设置的约束?

1 个答案:

答案 0 :(得分:1)

我认为解决方案是禁用 ViewA 的自动调整遮罩:

viewA.translatesAutoresizingMaskIntoConstraints = false

因为您正在使用约束进行布局。现在它尝试将ViewA的高度设置为0,这会导致问题。