Как добавить NSLayoutConstraints программно

Я хочу добавить кнопку в качестве подвида корневого представления. Кнопка должна располагаться горизонтально в центре, а также вертикально в центре супервизора. Я использую NSLayoutConstraints программно. Это мой код.

class ViewController: UIViewController {

    var button: UIButton!

    override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) {
        button = UIButton()
        button.setTitle("Hello World", forState: .Normal)
        button.backgroundColor = UIColor.blueColor()
        button.sizeToFit()
        self.view.addSubview(button)
        NSLayoutConstraint.activateConstraints([
            NSLayoutConstraint(item: button, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1, constant: 0),
            NSLayoutConstraint(item: button, attribute: .CenterY, relatedBy: .Equal, toItem: self.view, attribute: .CenterY, multiplier: 1, constant: 0)
        ])
    }
}

Я получаю следующее предупреждающее сообщение, также я не получил желаемых результатов.

20.07.2016 11:01:10.187 build[26982:309535] Невозможно одновременно удовлетворить ограничения. Вероятно, по крайней мере одно из ограничений в следующем списке вам не нужно.

Попробуй это:

(1) посмотрите на каждое ограничение и попытайтесь выяснить, чего вы не ожидаете;

(2) найти код, который добавил нежелательное ограничение или ограничения, и исправить его. (Примечание. Если вы видите NSAutoresizingMaskLayoutConstraints, значение которых вам непонятно, обратитесь к документации по свойству UIView translatesAutoresizingMaskIntoConstraints) ( "", "", " (Имена: '|':UIViewControllerWrapperView:0x7faa4be31770 )>", "" )

Попытается восстановиться, нарушив ограничение

Установите символическую точку останова в UIViewAlertForUnsatisfiableConstraints, чтобы отловить это в отладчике. Также могут быть полезны методы из категории UIConstraintBasedLayoutDebugging в UIView, перечисленные в . 20.07.2016 11:01:10.188 build[26982:309535] Невозможно одновременно удовлетворить ограничения. Вероятно, по крайней мере одно из ограничений в следующем списке вам не нужно.

Попробуйте следующее: (1) посмотрите на каждое ограничение и попытайтесь выяснить, чего вы не ожидаете;

(2) найти код, который добавил нежелательное ограничение или ограничения, и исправить его. (Примечание. Если вы видите NSAutoresizingMaskLayoutConstraints, значение которых вам не понятно, обратитесь к документации по свойству UIView translatesAutoresizingMaskIntoConstraints) ( "", "", "", " (Names: '|':UIViewControllerWrapperView:0x7faa4be31770 )>" )

Попытается восстановиться, нарушив ограничение

Установите символическую точку останова в UIViewAlertForUnsatisfiableConstraints, чтобы отловить это в отладчике. Также могут быть полезны методы из категории UIConstraintBasedLayoutDebugging в UIView, перечисленные в .


person Vikas    schedule 20.07.2016    source источник


Ответы (1)


NSLayoutConstraint — это один из способов динамического добавления ограничений автомакета.

let new_view:UIView! = UIView(frame: CGRectMake(20, 20, 100, 100));
new_view.backgroundColor = UIColor.redColor();
new_view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(new_view);
NSLayoutConstraint(item: new_view,
        attribute: .Leading,
        relatedBy: .Equal,
        toItem: view,
        attribute: .LeadingMargin,
        multiplier: 1.0,
        constant: 0.0).active = true
NSLayoutConstraint(item: new_view,
        attribute: .Top,
        relatedBy: .Equal,
        toItem: view,
        attribute: .TopMargin,
        multiplier: 1.0,
        constant: 20.0).active = true
NSLayoutConstraint(item: new_view,
        attribute: .Height,
        relatedBy: .Equal,
        toItem: new_view,
        attribute:.Width,
        multiplier: 2.0,
        constant:0.0).active = true
NSLayoutConstraint(item: new_view,
        attribute: .Width,
        relatedBy: .Equal,
        toItem: nil,
        attribute: .NotAnAttribute,
        multiplier: 1.0,
        constant: 100.0).active = true

установите translatesAutoresizingMaskIntoConstraints в false и вызовите метод layoutifneeded.

person Jagandeep Singh    schedule 20.07.2016