以编程方式禁用自动布局约束

时间:2014-09-24 15:38:41

标签: xcode swift

是否有任何编程方式暂时禁用自动布局约束?我不希望在一段时间内考虑这个约束,直到我再次需要它为止。

3 个答案:

答案 0 :(得分:35)

在为iOS 8.0或更高版本开发时,只需在创建IBOutlet后使用isActive NSLayoutConstraint属性。

已更新

  • 根据以下建议强烈提及出口,谢谢@rob mayoff。
  • 使用.isActive代替.active与Swift 4建议,谢谢@Mohit Singh。

您的手机将有以下渠道:

@IBOutlet var photoBottomConstraint: NSLayoutConstraint!

您可以访问willDisplayCell中的约束,如:

myCell.photoBottomConstraint.isActive = false

当你再次需要它时:

myCell.photoBottomConstraint.isActive = true

答案 1 :(得分:7)

根据oyalhi的回答,还要指出如果你想让它不活跃,你必须强烈引用你的约束:

@IBOutlet var photoBottomConstraint: NSLayoutConstraint!

这不是明显的,但如果您使用的是弱引用,photoBottomConstraint在此次通话后可能为零:

myCell.photoBottomConstraint.active = false

答案 2 :(得分:3)

您使用NSView' s removeConstraint:;如果您已在界面构建器中创建了约束,则可以通过IBOutlet

将其连接到代码
class MyView : NSView {
    @IBOutlet var temporaryConstraint : NSLayoutConstraint! 

    var constraint : NSLayoutConstraint! = nil /* my strong link */ 
    var constraintShowing : Bool

    func awakeFromNib() {
         constraint = temporaryConstraint
    }

    func toggleLayoutConstraint(sender : AnyObject) -> () {
         if constraintShowing {
             self.removeConstraint( constraint )      
         } else {
             self.addConstraint( constraint )   
         }
         constraintShowing = !constraintShowing
    }
}

类似于我们曾经在{10.4}之前与NSTableColumns进行过舞蹈的舞蹈。


你也可以做一个小控制器小工具

class ConstraintController {
    var constraint : NSLayoutConstraint
    var view       : NSView
    var show       : Bool {
        didSet {
            if show {
                view.addConstraint(constraint)
            } else {
                view.removeConstraint(constraint)
            }
        }
    } 

    init (c : NSLayoutConstraint, inView : NSView) {
        constraint = c
        view = inView
        show = true
    }
}

class MyView : NSView {
    @IBOutlet var temporaryConstraint : NSLayoutConstraint!
    var control : ConstraintController? = nil

    func awakeFromNib() -> () { 
        control = ConstraintController(temporaryConstraint, inView: self)
    }

    func show(sender : AnyObject!) -> () {
        control!.show
    }

    func hide(sender : AnyObject!) -> () {
        control!.hide
    }
}

更多的线条,但可以说更容易理解,也不那么讨厌。