2015-12-21 11 views
10

Ben constraintEqualToAnchor() kullanarak AutoLayout kısıtlamalarıyla bir görünümü ayarlamak için deneyin:Otomatik Düzenleme kısıtlamaları constraintEqualToAnchor() kullanıldığında ayarlandıktan sonra nasıl değiştirilir?

kodunun son satırında
override func viewDidLoad() { 
    super.viewDidLoad() 

    let myView = UIView() 
    myView.backgroundColor = UIColor.orangeColor() 
    myView.translatesAutoresizingMaskIntoConstraints = false 
    view.addSubview(myView) 

    myView.leftAnchor.constraintEqualToAnchor(view.leftAnchor).active = true 
    myView.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor).active = true 
    myView.topAnchor.constraintEqualToAnchor(view.topAnchor).active = true 
    myView.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor).active = true 

    /******************************************/ 
    /* I try to change one of the constraints */ 
    /******************************************/ 
    myView.leftAnchor.constraintEqualToAnchor(view.rightAnchor, constant: -100).active = true 
} 

, çok kısıtlı birini değiştirmek deneyin. Ben o iş düşündüm ama constraintEqualToAnchor()? kullanarak, onları belirledik sonra sonra kısıtlamayı değiştirmek için doğru yolu nedir zaman konsol günlüğüne

"<NSLayoutConstraint:0x7fb53a5180d0 H:|-(0)-[UIView:0x7fb53a5190b0](LTR) (Names: '|':UIView:0x7fb53a519240)>", 
"<NSLayoutConstraint:0x7fb53a51f660 H:[UIView:0x7fb53a519240]-(-100)-[UIView:0x7fb53a5190b0](LTR)>", 
"<NSLayoutConstraint:0x7fb53a711ee0 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fb53a519240(414)]>" 

bazı hata veriyor?

+0

'önce değiştirmeden önce (son satır), ama yine de başarısız olur. Sanırım burada bir yanlış anlaşılma var ... –

+0

Kısıtlama referansını tutmaya ve daha sonra sabitleri doğrudan ayarlamaya çalıştınız mı? Görünüşe yeni sınırlamalar uygulayamazsınız, yoksa kısıtlı bir hale gelecektir. –

+0

@LucasDerraugh Düzeni çapalarla nasıl yapacağımı bilmiyorum. Bana cevabın kodunu gösterebilir misin? –

cevap

21

Yeni bir tane aktive olduğunda önceki kısıtlamayı devre dışı bırakmanız gerekir. Bunu yapmak için, ViewController bir özellik olarak kısıtların her bir başvuru depolamak ve daha sonra yeni kısıtlamayı oluşturma ve etkinleştirmeden önce false eski kısıtlaması active özelliğini ayarlayın:

Swift 2.x:

class ViewController: UIViewController { 
    var leftConstraint: NSLayoutConstraint? 
    var trailingConstraint: NSLayoutConstraint? 
    var topConstraint: NSLayoutConstraint? 
    var bottomConstraint: NSLayoutConstraint? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let myView = UIView() 
     myView.backgroundColor = UIColor.orangeColor() 
     myView.translatesAutoresizingMaskIntoConstraints = false 
     view.addSubview(myView) 

     leftConstraint = myView.leftAnchor.constraintEqualToAnchor(view.leftAnchor) 
     leftConstraint?.active = true 

     trailingConstraint = myView.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor) 
     trailingConstraint?.active = true 

     topConstraint = myView.topAnchor.constraintEqualToAnchor(view.topAnchor) 
     topConstraint?.active = true 

     bottomConstraint = myView.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor) 
     bottomConstraint?.active = true 

     /******************************************/ 
     /* I try to change one of the constraints */ 
     /******************************************/ 
     leftConstraint?.active = false 
     leftConstraint = myView.leftAnchor.constraintEqualToAnchor(view.rightAnchor, constant: -100) 
     leftConstraint?.active = true 
    } 
} 

Güncelleme için Swift 3 sözdizimi:

class ViewController: UIViewController { 
    var leftConstraint: NSLayoutConstraint? 
    var trailingConstraint: NSLayoutConstraint? 
    var topConstraint: NSLayoutConstraint? 
    var bottomConstraint: NSLayoutConstraint? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let myView = UIView() 
     myView.backgroundColor = UIColor.orange 
     myView.translatesAutoresizingMaskIntoConstraints = false 
     view.addSubview(myView) 

     leftConstraint = myView.leftAnchor.constraint(equalTo: view.leftAnchor) 
     leftConstraint?.isActive = true 

     trailingConstraint = myView.trailingAnchor.constraint(equalTo: view.trailingAnchor) 
     trailingConstraint?.isActive = true 

     topConstraint = myView.topAnchor.constraint(equalTo: view.topAnchor) 
     topConstraint?.isActive = true 

     bottomConstraint = myView.bottomAnchor.constraint(equalTo: view.bottomAnchor) 
     bottomConstraint?.isActive = true 

     /******************************************/ 
     /* I try to change one of the constraints */ 
     /******************************************/ 
     leftConstraint?.isActive = false 
     leftConstraint = myView.leftAnchor.constraint(equalTo: view.rightAnchor, constant: -100) 
     leftConstraint?.isActive = true 
    } 
} 
İşte
+0

Harika, teşekkürler! Neden bir kısıtı saklamak için bir değişkene ihtiyaç duyduğumu merak ediyorum, neden doğrudan '.active = false' değiştiremiyorum (örn. MyView.leftAnchor.constraintEqualToAnchor (view.leftAnchor) .active = false)? –

+1

'myView.leftAnchor.constraintEqualToAnchor (view.leftAnchor)' yeni bir kısıtlama oluşturur. Eski olana erişmiyor. – vacawama

+0

Anlıyorum, teşekkürler! Ve bu tür bir kısıtlama değişikliğini canlandırmak mümkün mü? Kısıtlamaları değiştirerek aslında bir sayfa kaydırma etkisine ulaşmaya çalışıyorum. Ben sadece UIView.animation() ile denedim, "sabit" kullanmadığım sürece animasyon yok (ama umarım sürekli kullanmam gerekmiyor). –

2

Aşağıda, daha sonra başvurulan bir kısıtlama c bildiren bir örnek verilmiştir. Yeni bir sabit değer belirledik ve ardından süper görünümde layout'u aradık. Eğer görünümü zorlayıcı üzerinde sona kalmamak

myView.translatesAutoresizingMaskIntoConstraints = false 

var constraints: [NSLayoutConstraint] = [ 
    myView.topAnchor.constraintEqualToAnchor(view.topAnchor), 
    myView.leftAnchor.constraintEqualToAnchor(view.leftAnchor), 
    myView.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor) 
]   
let c = myView.rightAnchor.constraintEqualToAnchor(view.rightAnchor)  
constraints.append(c) 

view.addSubview(myView) 
NSLayoutConstraint.activateConstraints(constraints) 

// Some time later 
c.constant = -100 
view.layout() 
+0

Yeni bir sabit atama, sorunumu çözemez. Bir kısıtlamayı kaldırmam ve yeni bir tane eklemem gerek. Bir kısıtlamayı kaldırmak/devre dışı bırakmak mümkün mü? –

+0

Son satırımın sadece sabit değeri değil, yeni bir kısıtlamayı değiştirdiğini görebilirsiniz. Sol ankraj ebeveynin sol ankrajı ile hizalanmıştı ve ebeveynin sağ ankrajı 100 ile aynı hizaya getirmek istedim. Sadece sabit bir değişiklik değil. –

+0

Bu tür bir sürekli değişimi çevrimiçi buldum ancak çalışma sınırında programlı olarak yeni bir kısıtlama ekleyebilmek için bir kısıtlamayı nasıl kaldıracağımı/devre dışı bıraktığımı bulamıyorum. –

0
// method myView.topAnchor.constraintEqualToAnchor creates new one inactive anchor 
// and not returns exist with equal relationships  

// you can set identifier for any constraint in Interface Builder or code and find & update in code 
for (NSLayoutConstraint *c in [self.view constraintsAffectingLayoutForAxis:UILayoutConstraintAxisHorizontal]) 
{ 
    if (YES == [c.identifier isEqualToString:@"my.layout-constraint.id"]) 
    { 
     // Unlike the other properties, the constant can be modified 
     // after constraint creation. 
     // Setting the constant on an existing constraint performs much better 
     // than removing the constraint and adding a new one that's exactly like 
     // the old except that it has a different constant. 

     c.constant = 123; 

     // if needed 
     // [self.view setNeedsUpdateConstraints]; 

     break; 
    } 
} 
0

bir StackView değiştirerek EĞER deyimi ile örneğidir ve bir tıklandığında segmente zaman görüntüle: false `etmek .active` ben` myView.leftAnchor.constraintEqualToAnchor (view.leftAnchor) set düşündüm

if (sender as AnyObject).selectedSegmentIndex == 0{ 


     // Shrink the white view and stack view 
     heightConstraintView = containerView.heightAnchor.constraint(equalToConstant: 100) 
     heightConstraintView?.isActive = true 

     heightConstraintStackView = stackView.heightAnchor.constraint(equalToConstant: 100) 
     heightConstraintStackView?.isActive = true 
    } 

    else { 


     // Before returning back the white view and stack view DEACTIVATE teh previous constraints 
     heightConstraintView?.isActive = false 
     heightConstraintStackView?.isActive = false 

     // Returning back the white view and stack view to normal size 
     heightConstraintView = containerView.heightAnchor.constraint(equalToConstant: 200) 
     heightConstraintView?.isActive = true 

     heightConstraintStackView = stackView.heightAnchor.constraint(equalToConstant: 200) 
      heightConstraintStackView?.isActive = true 
    } 
İlgili konular