2014-09-24 96 views
20

是否有任何編程方式來臨時禁用自動佈局約束?我不想在一段時間內考慮這個約束,直到我再次需要它爲止。以編程方式禁用自動佈局約束

+5

在10.10中,'NSLayoutConstraint'獲得了一個'active'屬性,可以設置爲false來禁用它。將其設置爲true可啓用它。 – 2014-09-24 17:52:28

+0

@KenThomases我也看到了這個,但是當我將'active'設置爲'false'後,約束沒有被禁用。有沒有任何示例代碼?我試圖找到一些關於此的樣本或博客,我只是找不到任何。 – 2015-12-21 12:50:32

回答

3

您使用NSViewremoveConstraint:;如果你創建的界面生成器約束你通過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 
    } 
} 

更多行,但無疑更容易理解和更小的hackish。

+0

所以你只是保持對約束對象的引用,同時從視圖中刪除它?有沒有更乾淨的方式來做到這一點,如.enabled屬性? – TheNotSoWise 2014-09-24 17:22:37

+0

我在想你可以寫一點控制器/包裝類... – iluvcapra 2014-09-24 17:23:50

+0

嘿,我會如果我沒有明顯的選擇。看起來這是應該已經存在的功能。 – TheNotSoWise 2014-09-24 17:25:13

33

在開發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 
+13

如果您想稍後重新激活約束條件,您可能需要聲明出口'strong'(或者因爲'strong'是默認值,所以不要放棄'weak')。當禁用約束時,視圖不再引用它,如果在某處沒有強引用,它將被解除分配,並且「弱」插座將被設置爲零。 – 2016-04-12 01:49:19

+0

愛與迅速工作 – 2016-06-29 11:53:05

+0

真的很棒的答案..保存一天。大 – 2016-11-14 06:46:09

6

基於oyalhi的回答,也想指出你必須作出強烈參考您的約束,如果你想使之失去活性:

@IBOutlet var photoBottomConstraint: NSLayoutConstraint! 

它不是abvious,但如果你使用弱引用,photoBottomConstraint可能是零此調用後:

myCell.photoBottomConstraint.active = false