删除/修改代码中的autolyout约束

时间:2014-11-07 13:49:57

标签: ios objective-c storyboard autolayout

后台:我正在使用界面构建器构建论坛,其中视图控制器中有一个表视图,外部有一个输入附件视图。在运行时,输入附件视图将添加到表视图中,并成为类似信使的输入栏。

enter image description here

我试图通过更改高度限制来实现输入附件视图上的自动调整大小功能(通常在消息应用程序中看到)。但是,无法在界面构建器中创建输入附件视图的高度约束,因此我只是将它们添加到代码中。

NSLayoutConstraint *inputAccessoryConstraint = [NSLayoutConstraint constraintWithItem:self.inputAccessoryView
                                                                            attribute:NSLayoutAttributeHeight
                                                                            relatedBy:NSLayoutRelationEqual
                                                                               toItem:nil attribute:NSLayoutAttributeNotAnAttribute
                                                                           multiplier:1.0
                                                                             constant:100];

[self.inputAccessoryView addConstraint:inputAccessoryConstraint];

并收到以下警告:

Unable to simultaneously satisfy constraints.
...
(
"<NSLayoutConstraint:0x7fa5a413f450 V:[UIView:0x7fa5a264f8d0(100)]>",
"<NSLayoutConstraint:0x7fa5a2483890 '_UIKBAutolayoutHeightConstraint' V:[UIView:0x7fa5a264f8d0(44)]>"
)

问题是我的新约束与运行时中添加的一个自动布局约束冲突。如何删除/修改代码中的autolayout约束?

3 个答案:

答案 0 :(得分:1)

您可能希望在添加自己的高度约束(44)之前删除现有的高度约束(44)。 但您也可以只编辑现有约束:

下面的块正在浏览inputAccessoryView的约束并找到高度Constraint。 然后它将值设置为100而不是44。

for (NSLayoutConstraint* constraint in YOURINPUTACCESSORYVIEW.constraints) {
    if ([NSStringFromClass([NSLayoutConstraint class]) isEqualToString:NSStringFromClass([constraint class])])
    {
        if (constraint.firstAttribute == NSLayoutAttributeHeight || constraint.secondAttribute == NSLayoutAttributeHeight)
        {
            constraint.constant = 100;
        }
    }
}

答案 1 :(得分:0)

嘿,我发现解决这个问题的最佳方法是马蒂厄通过改变_UIKBAutolayoutHeightConstraint的常数来说明。这可以在Objective-C中实现:

NSLayoutConstraint *constraint = [[self.inputAccessoryView constraints] objectAtIndex:0];
constraint.constant = 100;

或者在Swift中这样:

let constraint:NSLayoutConstraint = (inputAccessoryView!.constraints() as NSArray).objectAtIndex(0) as NSLayoutConstraint
constraint.constant = 52

如果您希望在视图出现之前重新加载inputAccessoryView的高度,可以在updateViewConstraints中执行此操作。希望这会有所帮助。

答案 2 :(得分:0)

我遇到了同样的问题,并找到了一个简单的解决方法。只需将“发送”按钮和“文本”视图嵌入到中间视图中即可。将该视图的高度强制为100.f,并使用自动布局约束将其附加到左侧,右侧和底部的超级视图(即:键盘输入附件视图)。然后确保输入附件视图不会剪切它的子视图。

瞧,系统仍然会将输入附件视图高度调整为44.f,但这并不重要,视觉上它将是预期的大小。没有警告。

enter image description here