在 NSLayoutConstraint 上更新“常量”失败,并显示“无法分配给 'constraint' 中的 'constant'”

Posted

技术标签:

【中文标题】在 NSLayoutConstraint 上更新“常量”失败,并显示“无法分配给 \'constraint\' 中的 \'constant\'”【英文标题】:Updating "constant" on a NSLayoutConstraint fails with "Cannot assign to 'constant' in 'constraint'"在 NSLayoutConstraint 上更新“常量”失败,并显示“无法分配给 'constraint' 中的 'constant'” 【发布时间】:2015-01-17 00:12:20 【问题描述】:

我的 UIView 子类中有以下 swift 代码:

    for constraint in self.constraints() 
        if (constraint.firstItem as UIView == volumeOverlay && constraint.firstAttribute == NSLayoutAttribute.Top) ||
           (constraint.secondItem as UIView == volumeOverlay && constraint.secondAttribute == NSLayoutAttribute.Top) 
            NSLog ("Found constraint. Top is: \(constraint.constant)")
            constraint.constant = 100
        
    

我收到编译时错误:

...TrackView.swift:25:37: 无法在“约束”中分配给“常量”

NSLayoutConstraint 的文档说

与其他属性不同,常量可以在约束创建后修改。在现有约束上设置常量比删除约束并添加一个与旧约束一样但具有新常量的新约束要好得多。

那么我做错了什么无法更新“常量”变量?

顺便说一句,这是适用于 ios8 的 XCode 6.1.1

【问题讨论】:

【参考方案1】:

好的,我明白了。我没有意识到 self.constraints() 返回 [AnyObject],所以我不得不将“约束”转换为 NSLayoutConstraint。

可能有更优雅的方式,但这是我现在拥有的:

    var y: CGFloat = // do some calculation....
    for constraintObj in self.constraints() 
        if constraintObj.isKindOfClass(NSLayoutConstraint) 
            var constraint = constraintObj as NSLayoutConstraint
            if (constraint.firstItem as UIView == volumeOverlay && constraint.firstAttribute == NSLayoutAttribute.Top) ||
               (constraint.secondItem as UIView == volumeOverlay && constraint.secondAttribute == NSLayoutAttribute.Top) 
                constraint.constant = y
                break
            
        
    

是的。有用。

【讨论】:

您是否在 Interface Builder 中创建了约束?如果是这样,您可以在您的类中创建一个 IBOutlet,允许您直接访问适当的约束 - 使用助手编辑器和 ctrl-从适当的约束拖动到您的 .swift 文件 - 创建 IBOutlet 然后您可以直接引用约束 酷!我没有意识到你可以像那样直接引用约束!

以上是关于在 NSLayoutConstraint 上更新“常量”失败,并显示“无法分配给 'constraint' 中的 'constant'”的主要内容,如果未能解决你的问题,请参考以下文章

如何更新之前在代码中设置的 NSLayoutConstraint 常量? - 斯威夫特

什么时候更新 UITableView 高度 NSLayoutConstraint 最合适

如何以编程方式更改或更新 NSLayoutConstraint

更改 NSLayoutConstraint 的常量

iOS NSLayoutConstraint 设置 multiplier ,多次更新无效问题

在 UITextView 上使用 NSLayoutConstraint 会将 contentSize 重置为 0,0