将前导空间设置为 UIView ,迅速崩溃

Posted

技术标签:

【中文标题】将前导空间设置为 UIView ,迅速崩溃【英文标题】:Set Leading space to UIView , Crashes in swift 【发布时间】:2015-07-13 11:31:51 【问题描述】:

我需要修改视图的前导空格。这是我的代码

    let advSearchViewAddLeadingConstraint: NSLayoutConstraint = NSLayoutConstraint(
        item:advancedSearchView,
        attribute:NSLayoutAttribute.Leading,
        relatedBy:NSLayoutRelation.Equal,
        toItem:self.view, 
        attribute:NSLayoutAttribute.NotAnAttribute,
        multiplier:0,
        constant:200)
        self.view.addConstraint(advSearchViewAddLeadingConstraint)

通过使用此代码,我正在崩溃

* 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'* +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: Unknown layout attribute'

【问题讨论】:

为什么要使用NSLayoutAttribute.NotAnAttribute 和乘数0,当您必须设置前导空间约束时。 我在情节提要中添加了视图,我添加了前导、尾随、顶部、底部和高度约束。现在在视图控制器中,我需要根据数据动态更改前导空间。当时崩溃了 您是否以编程方式添加了前导、尾随、顶部、底部和高度约束?? 不,我已在情节提要中添加。现在我想改变前导空间和高度约束,高度约束工作正常并且前导空间出现问题。 然后将 IBOutlet 添加到情节提要中的主要约束 【参考方案1】:

我会反其道而行之。创建一个包含视图并拖动一个 IBOutlet 用于前导空间约束。然后只需更改常量,它应该会更好。

leadingConstraint.constant = 200
self.view.layoutIfNeeded()

【讨论】:

【参考方案2】:

您可能想要NSLayoutAttribute.Leading 而不是NSLayoutAttribute.NotAnAttribute。如果您提供两个项目,则需要指定每个项目的属性:

let advSearchViewAddLeadingConstraint: NSLayoutConstraint =
    NSLayoutConstraint(
        item:advancedSearchView,
        attribute:NSLayoutAttribute.Leading,
        relatedBy:NSLayoutRelation.Equal,
        toItem:self.view, 
        attribute:NSLayoutAttribute.Leading,
        multiplier:0,
        constant:200)

其他几点说明:

您可以通过以下方式激活约束:advSearchViewAddLeadingConstraint.active = true

在 Swift 中,类型推断可以帮助您处理枚举类型,因此您可以输入 Leading,而不是输入 NSLayoutAttribute.Leading

【讨论】:

以上是关于将前导空间设置为 UIView ,迅速崩溃的主要内容,如果未能解决你的问题,请参考以下文章

为 iCarousel 使用自定义 UIView

如何使第一行标签位于另一个 UIView 的同一中心位置

将 UIButton 放置在与 UITabBar 相同的空间中(隐藏时)

UIView 子视图没有动画

无法将 NIB 文件加载到 UIView

UIView 事件应用约束并设置子视图宽度