Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 以编程方式禁用自动布局约束_Xcode_Swift - Fatal编程技术网

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

Xcode 以编程方式禁用自动布局约束,xcode,swift,Xcode,Swift,是否有任何编程方法临时禁用自动布局约束?在我再次需要该约束之前,我根本不希望在一段时间内考虑该约束。您使用NSView的removeConstraint:;如果已在interface builder中创建约束,则可通过IBOutlet将其连接到代码 class MyView : NSView { @IBOutlet var temporaryConstraint : NSLayoutConstraint! var constraint : NSLayoutConstraint

是否有任何编程方法临时禁用自动布局约束?在我再次需要该约束之前,我根本不希望在一段时间内考虑该约束。

您使用
NSView
removeConstraint:
;如果已在interface builder中创建约束,则可通过
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
    }
}

行数更多,但可以说更容易理解,也不太粗俗。

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

更新

  • 要根据下面的建议对门店进行有力的参考,请@rob mayoff感谢您
  • 要使用.isActive而不是.active,请按照下面的建议使用Swift 4,谢谢@Mohit Singh
您的手机将具有以下插座:

@IBOutlet var photoBottomConstraint: NSLayoutConstraint!
您可以访问
willDisplayCell
中的约束,如下所示:

myCell.photoBottomConstraint.isActive = false
当您再次需要时:

myCell.photoBottomConstraint.isActive = true

根据oyalhi的回答,我还想指出,如果您想使其处于非活动状态,您必须对您的约束进行强有力的引用:

@IBOutlet var photoBottomConstraint: NSLayoutConstraint!
这不是显而易见的,但如果您使用的是弱引用,
photoBottomConstraint
在此调用后可能为零:

myCell.photoBottomConstraint.active = false

因此,在将约束对象从视图中移除时,您只保留对约束对象的引用?有没有更干净的方法像一个启用了.property的属性那样做呢?呵呵,如果我显然没有选择的话,我会的。这似乎是应该已经存在的功能。您也可以尝试调整约束的活动优先级,但这可能不起作用。根据您正在执行的操作,您可能会转而查看NSViewAnimation,这通常是人们动态更改视图属性的方式。我尝试混淆优先级,但这会导致我正在执行的操作崩溃。我会试试你最初的建议。提醒你一句。我在使用active/deactive时不断出错,直到我更改了每个约束的优先级。在10.10中,
NSLayoutConstraint
获得一个
active
属性,该属性可以设置为false以禁用它。将其设置为true启用它。@Kenthomass我也看到了这一点,但在我将
活动
设置为
后,约束未被禁用。这有什么样的代码吗?我试图找到一些关于此的示例或博客,但找不到任何示例或博客。如果您想稍后重新激活约束,可能需要声明插座
strong
(或者只需停止
weak
,因为
strong
是默认设置)。当约束被停用时,视图不再引用它,如果您在某个地方没有对它的强引用,它将被解除分配,并且
出口将设置为零。在Swift 4中
活动
已重命名为
isActive