【问题标题】:Delete/modify autolyout constraint in code在代码中删除/修改 autolyout 约束
【发布时间】:2014-11-07 13:49:57
【问题描述】:

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

我试图通过更改高度约束在输入附件视图上实现自动调整大小功能(常见于消息传递应用程序)。但是没有办法在界面生成器中创建输入附件视图的高度约束,所以我只是在代码中添加了它们。

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)]>"
)

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

【问题讨论】:

  • 您是在代码中还是在 IB 中创建 inputAccessoryView?如果在代码中,也许你需要添加:[yourInputAccessoryView setTranslatesAutoresizingMaskIntoConstraints:NO];
  • @Mathieu 在 IB 中,然后通过 self.inputAccessoryView = self.keybordBar; 将其添加到代码中的 tableview 中[self.tableView 成为FirstResponder];
  • @Peter 你解决过这个问题吗?我也有类似的问题!
  • @Tometoyou 不幸的是没有。

标签: ios objective-c storyboard autolayout


【解决方案1】:

您可能需要先删除现有的高度约束 (44),然后再添加您的 (100)。 但您也可以只编辑现有的约束:

下面的块是浏览你的 inputAccessoryView 的约束并找到高度约束。 然后它将值设置为 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;
        }
    }
}

【讨论】:

  • 抱歉,这不起作用。其实IF语句没有通过。
【解决方案2】:

嘿,我发现解决这个问题的最佳方法是正如 Mathieu 所说,通过更改 _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 中执行。希望这会有所帮助。

【讨论】:

    【解决方案3】:

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

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

    【讨论】: