2016-03-09 3 views
0

У меня конфликт NSLayoutConstraint, когда я пытаюсь вручную установить ограничения IBOutlet. По сути, я просто помещаю взгляды в раскадровку, чтобы получить общее представление о том, как они будут выглядеть, и затем создать IBOutlet s для ссылки на них. Но все ограничения добавляются в код:Конфликт ограничений IBOutlets

class LoginViewController: UIViewController, UITextFieldDelegate { 


    @IBOutlet weak var view1: UIView! 
    @IBOutlet weak var view2: UView2! 
    @IBOutlet weak var name: UITextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 


     view2.addSubview(name) 

     //add constraints 
     NSLayoutConstraint(item: view1, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1, constant: 0).active = true 
     NSLayoutConstraint(item: view1, attribute: .CenterY, relatedBy: .Equal, toItem: self.view, attribute: .CenterY, multiplier: 1, constant: -self.view.frame.height * 0.07).active = true 
     NSLayoutConstraint(item: view1, attribute: .Width, relatedBy: .Equal, toItem: self.view, attribute: .Width, multiplier: 0.8, constant: 0).active = true 
     NSLayoutConstraint(item: view1, attribute: .Height, relatedBy: .Equal, toItem: self.view, attribute: .Height, multiplier: 0.4, constant: 0).active = true 

     NSLayoutConstraint(item: view2, attribute: .Width, relatedBy: .Equal, toItem: view1, attribute: .Width, multiplier: 1, constant: 0).active = true 
     NSLayoutConstraint(item: view2, attribute: .CenterX, relatedBy: .Equal, toItem: view1, attribute: .CenterX, multiplier: 1, constant: 0).active = true 
     NSLayoutConstraint(item: view2, attribute: .Top, relatedBy: .Equal, toItem: view1, attribute: .Bottom, multiplier: 1, constant: self.view.frame.height * 0.01).active = true 
     NSLayoutConstraint(item: view2, attribute: .Height, relatedBy: .Equal, toItem: self.view, attribute: .Height, multiplier: 0.1, constant: 0).active = true 



     } 
} 

NSLayoutConstraint конфликт уходит, когда я просто создать представление в коде, т.е. var view2 = UIView() или если я закомментировать ограничения view2 «s. Я не понимаю.

EDIT: на основании журнала проблема выглядит NSIBPrototypingLayoutConstraint и UIView-Encapsulated-Layout-Height' для view2, хотя в раскадровке нет ограничений макета. Что меня смущает, почему у view1 есть эта проблема, так как они были добавлены в раскадровку?

+0

Вы удалили все ограничения из SB? – sschale

+0

Да. Я дважды проверял – Liumx31

ответ

1

Вы не задали ограничений на view2 в раскадровке, поэтому Xcode тайно добавляет ограничения для вас. Что вам нужно сделать, это добавить ограничения для view2 в раскадровке, и (потому что вы действительно не хотите, чтобы они во время выполнения) сказать Xcode, чтобы удалить эти ограничения во время сборки:

"Remove at build time" checkbox in the Size inspector

+0

Я создал фиктивное ограничение и выбрал этот параметр, и он сработал! Спасибо, хотя, если я могу задать вам другой вопрос - я попытался сделать это в коде 'view2.removeConstraints (view2.constraints)', но это было эффективно, в чем разница между «Удалить во время сборки» и этой строкой кода в 'viewDidLoad()'? – Liumx31

+0

Также я не делал этого для 'view1', но он работает? – Liumx31

+2

@ user245954 - Выбор «Удалить во время сборки» - это более эффективный подход, предотвращающий создание ограничения во время выполнения, чтобы впоследствии удалить или деактивировать его. Кроме того, имейте в виду, что не все ограничения для представления находятся в коллекции 'view2.constraints', но могут быть прикреплены к ближайшему общему родительскому элементу (например, супервину). Выбирая «удалить во время сборки», вы выходите из глупости выяснения, какие ограничения есть где. (Честно говоря, если бы я собирался программно удалить/активировать/изменить их, я бы создал коллекцию выпускников IB и использовал это.) – Rob

Смежные вопросы