2016-07-16 4 views
1

Я пытаюсь использовать автоматическую компоновку программно по языку визуального формата на представлении, которое находится на раскадровке, но не выполнено. Код, как показано ниже: (Btw, раскадровка, который показывает bView не важна, так что я не загрузить картинку раскадровки, и я не сделал установку любого ограничить на раскадровке..)Каким образом можно просматривать макет, который находится на раскадровке программно?

class ViewController: UIViewController { 

    @IBOutlet var bView: UIView! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     bView.translatesAutoresizingMaskIntoConstraints = false 
     var allConstraints = [NSLayoutConstraint]() 
     let vC = NSLayoutConstraint.constraintsWithVisualFormat("V:|-[bView]-|", options: [], metrics: nil, views: ["bView":bView]) 
     let hC = NSLayoutConstraint.constraintsWithVisualFormat("H:|-[bView]-|", options: [], metrics: nil, views: ["bView":bView]) 
     allConstraints += vC 
     allConstraints += hC 
     NSLayoutConstraint.activateConstraints(allConstraints) 
    } 

    override func viewWillLayoutSubviews() { 
     super.viewWillLayoutSubviews() 
    } 
} 

Но когда это выполняет, он показывает сообщение об ошибке:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse constraint format: Unable to interpret '|' character, because the related view doesn't have a superview V:|-[bView]-| ^'

Я думаю, может быть, SuperView (вид на ViewController) сделал добавить на MainWindow. Поэтому я попытался исправить эту проблему, переместив код на viewWillLayoutSubviews(). Как ниже:

class ViewController: UIViewController { 

    @IBOutlet var bView: UIView! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func viewWillLayoutSubviews() { 
     super.viewWillLayoutSubviews() 
     bView.translatesAutoresizingMaskIntoConstraints = false 
     var allConstraints = [NSLayoutConstraint]() 
     let vC = NSLayoutConstraint.constraintsWithVisualFormat("V:|-[bView]-|", options: [], metrics: nil, views: ["bView":bView]) 
     let hC = NSLayoutConstraint.constraintsWithVisualFormat("H:|-[bView]-|", options: [], metrics: nil, views: ["bView":bView]) 
     allConstraints += vC 
     allConstraints += hC 
     NSLayoutConstraint.activateConstraints(allConstraints) 
    } 
} 

Тогда это показывает действительно смешной неправильный результат.

enter image description here

Итак, как я макет вид, который находится на раскадровке программно?


Более того, есть забавный результат, как это: (Это не связано с вопросом непосредственно, но вы можете попробовать это для удовольствия!)

enter image description here

С кодом:

class ViewController: UIViewController { 

    @IBOutlet var bView: UIView! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func viewWillLayoutSubviews() { 
     super.viewWillLayoutSubviews() 
     bView.translatesAutoresizingMaskIntoConstraints = false 
    } 
} 
+0

Предполагается, что bView должен быть синим или белым фоном? – vacawama

ответ

1

Если вы пытаетесь сдержать синий прямоугольник, то ваша первая проблема заключается в том, что ваш выход bView - это i ncorrectly wired до вашего верхнего уровня (белый фон). Удалите это соединение в инспекторе подключений , а затем проведите синий вид до bView.

Если вы добавили представление в Interface Builder, но не давайте никаких ограничений, то Xcode добавит 4 ограничения во время сборки. Если вы нажмете на ваш взгляд, вы увидите следующее сообщение в Размер инспектора:

The selected views have no constraints. At build time, explicit left, top, width, and height constraints will be generated for the view.

Итак, ваше мнение уже полностью определен. Если вы добавите больше ограничений в код, у вас возникнут конфликты.

Итак, как вы можете добавить ограничения в код для представления, выложенного в раскадровке? Вам необходимо сделать следующее:

  1. Добавить явные ограничения в раскадровке для левой, верхней, ширины и высоты.

    enter image description here

  2. Редактировать эти 4 ограничения в Размер инспектора и установите флажок рядом с Заполнитель [] Удалить во время сборки.

    add 4 explicit constraints

Затем эти 4 ограничения будут удалены во время сборки оставляя вид без ограничений. Теперь ваш код может свободно добавлять ограничения.

+0

Он работает, спасибо! Btw, я попробовал «bView.removeConstraints (bView.constraints)» перед тем, как добавить свои ограничения, а затем он работает, но одновременно показывает «Невозможно одновременно удовлетворить ограничения». Weird. – allenlinli

+0

Это, вероятно, потому, что 2 ограничения для позиционирования фактически добавили супервизор bview, поэтому вы только удалили ограничения ширины и высоты. – vacawama