2016-04-08 27 views
10

Görünüm denetleyicisinin sağ tarafına bağlı bir tür "panel" gibi davranacak bir görünüm oluşturmaya çalışıyorum. olduğuDenetleyici kenar boşluklarını görüntülemek için sınırlamaları programsal olarak oluşturmak

, bu sondaki, üstüne bağlı ve ancak 300

statik genişliğinde ana görünümü denetleyicisi alt kenar boşlukları, olduğu, sadece doğru, ben almak gibi olamaz ya bir kısıtlama kırıyor ya da xcode bir şey yapmamın yasadışı olduğunu söylüyor.

Neyi yanlış yapıyorum? İşte

kontrolörü

let myView = UIView() 
    view.backgroundColor = UIColor.redColor() 
    self.view.addSubview(view) 
    let topConstraint = NSLayoutConstraint(item: myView, 
              attribute: .Top, 
              relatedBy: .Equal, 
              toItem: self.topLayoutGuide, 
              attribute: .Bottom, 
              multiplier: 1, 
              constant: 0) 

    let trailingConstraint = NSLayoutConstraint(item: self.view, 
               attribute: .TrailingMargin, 
               relatedBy: .Equal, 
               toItem: myView, 
               attribute: .Trailing, 
               multiplier: 1, 
               constant: 0) 

    let bottomConstraint = NSLayoutConstraint(item: self.bottomLayoutGuide, 
               attribute: .Top, 
               relatedBy: .Equal, 
               toItem: myView, 
               attribute: .Bottom, 
               multiplier: 1, 
               constant: 0) 

    let widthConstraint = NSLayoutConstraint(item: myView, 
              attribute: .Width, 
              relatedBy: .Equal, 
              toItem: nil, 
              attribute: .NotAnAttribute, 
              multiplier: 1, 
              constant: 300) 

    self.view.addConstraints([trailingConstraint]) 
    view.addConstraints([topConstraint, bottomConstraint, widthConstraint]) 
+1

Bunun için neden Visual Format Dilini kullanmıyorsunuz? 'H: [panel (300)] |' ve 'V: | [toplayout] [panel] [botlayout] |' 'yeterli olmalıdır – Eendje

cevap

38

Aslında kodunuzda sorun d olmasıdır Kimlik, otomatik düzen kısıtlamaları kullanmak istediğinizdemyviewfalse olarak ayarlanmamışsa, bir görünümün yanlış olarak translatesAutoresizingMaskIntoConstraints değerini ayarlamanız gerekir. Başka bir Sorun, self.view'e myview'u eklememenizdir. Kodunuzu güncelledim ve İyi çalışıyor.

Kodun altına ViewController'nize koyun.

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

view.addConstraint(NSLayoutConstraint(item: myView, attribute: .Top, relatedBy: .Equal, toItem: self.topLayoutGuide, attribute: .Bottom, multiplier: 1, constant: 0)) 
view.addConstraint(NSLayoutConstraint(item: myView, attribute: .Bottom, relatedBy: .Equal, toItem: self.bottomLayoutGuide, attribute:.Top, multiplier: 1, constant: 20)) 

view.addConstraint(NSLayoutConstraint(item: myView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute,multiplier: 1, constant: 300)) 
view.addConstraint(NSLayoutConstraint(item: myView, attribute: .TrailingMargin, relatedBy: .Equal, toItem: view, attribute: .TrailingMargin, multiplier: 1, constant: 0)) 
+1

Programatik olarak kısıtlamalar eklemenin daha kolay bir yolunu istiyorsanız, https kullanırdınız : //github.com/keshavvishwkarma/KVConstraintExtensionsMaster –

+0

Cevabımı gerçekten beğenirseniz, o zaman da oylama yaparsınız. –

0

kod kodunuzda bazı belirsizlik var gibi görünüyor, sen MyView olarak bir UIView oluşturarak, ancak self.view görünümü ekleme ve ayrıca hatta kısıt kendisini görüntülemek için vardır. Kodunuzu düzeltin ve görünümü myView ile değiştirin. İkincisi, trueTranslayesAutoresizingMaskIntoConstraints öğesini false olarak ayarlayın. Ardından, tüm kısıtlamaları kendi kendine görüntüleme'ye ekleyin. Bu probleminizi çözmeli.

myView.setTranslatesAutoresizingMaskIntoConstraints(false) 
self.view.addConstraints([trailingConstraint, bottomConstraint, widthConstraint]) 

VFL ayrıca daha iyi ve temiz bir yaklaşımdır. Aslında, kısıtlamanın nasıl kurulduğunu görselleştiriyor.

5

Yukarıdaki örnek kodunuzda, view ve myView'u birkaç yerde karıştırıyor gibi görünüyorsunuz. Her durumda widthConstraint, myView ve topConstraint, trailingConstraint'a eklenmeli ve bottomConstraint, self.view'a eklenmelidir. Bunun sebebi, kısıtlamalarla ilgili her iki görüşün de yer aldığı en yakın süper görüntü atasına kısıtlamaların eklenmesidir. Alt görünümdeki bir öznitelik için alt görünüm özniteliğini kısıtladığınız durumda, sınırlama hem kendi görünümünü hem de alt görünümleri yerleştirdiği için ana görünüme eklenmelidir. Eğer iki kardeşin görüşleri arasında bir kısıtınız varsa, her iki görüşün de yer aldığı en yakın atasöz olduğu için, sınır ana görünümlerine eklenir.

iOS 9.0 ve üstünü hedefleyebiliyorsanız, bu tür kısıtlamalar oluşturmak için yeni NSLayoutAnchor ve NSLayoutDimension API'sini kullanmak daha temiz ve kolaydır. Ayrıca, sıkı tip kontrolü sağlar ve derleyici doğruluğu doğrulayabilir. Bu yeni API'ler sayesinde, örnek kod basitçe olacaktı:

let myView = UIView() 
myView.backgroundColor = UIColor.redColor() 
self.view.addSubview(myView) 

let margins = self.view.layoutMarginsGuide 
myView.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor).active = true 
myView.topAnchor.constraintEqualToAnchor(margins.topAnchor).active = true 
myView.bottomAnchor.constraintEqualToAnchor(margins.bottomAnchor).active = true 
myView.widthAnchor.constraintEqualToConstant(300.0).active = true 

açıkça Burada kısıtlamaları oluşturma Bu yöntemle ilgili daha fazla bilgi bulabilirsiniz vb doğru görünümüne artık kısıtlamaları eklemek gerek yok:

https://developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutAnchor_ClassReference/

ve burada:

https://developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutDimension_ClassReference/

İlgili konular