2017-02-18 5 views
0

Я новичок в разработке iOS. Я хочу построить макет без раскадровки или xib/nib. Поэтому я пытаюсь добавить ограничения программно. Я искал некоторые уроки о добавлении ограничений программно. Но представление не может отображаться правильно.Как добавить ограничение с динамической шириной программно

Я пытаюсь этот код в моем классе ViewController:

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    let testView = UIView() 
    self.view.addSubview(testView) 

    // Add Constraints 
    self.view.translatesAutoresizingMaskIntoConstraints = false 
    testView.translatesAutoresizingMaskIntoConstraints = false 

    let top = NSLayoutConstraint(item: testView, attribute: .top, relatedBy: .equal 
     , toItem: self.view, attribute: .top, multiplier: 1, constant: 50.0) 
    let bottom = NSLayoutConstraint(item: testView, attribute: .bottom, relatedBy: .equal 
     , toItem: self.view, attribute: .bottom, multiplier: 1, constant: -50.0) 
    let leading = NSLayoutConstraint(item: testView, attribute: .leading, relatedBy: .greaterThanOrEqual, toItem: self.view, attribute: .leading, multiplier: 1, constant: 50.0) 
    let trailing = NSLayoutConstraint(item: testView, attribute: .trailing, relatedBy: .greaterThanOrEqual, toItem: self.view, attribute: .trailing, multiplier: 1, constant: -50.0) 
    self.view.addConstraints([top, bottom, leading, trailing]) 
} 

Как правило, они не должны определять размер вида или ограничений относительно ширины и высоты в учебники. Но взгляды могут быть показаны в их учебнике. В моем случае, мой testView не может показать его в приложении, даже верхний, нижний, ведущий и конечный ограничения были установлены. Я что-то пропустил? В чем проблема?

один из учебников: http://www.knowstack.com/swift-nslayoutconstraint-programatically-sample-code/

Edit: Давайте я объясню подробнее. Я хочу создать UIView, подходящий для универсального устройства. UIView имеет верхние, нижние, ведущие и конечные ограничения с constant: 10. Поэтому мне не нужно устанавливать размер UIView.

Expected Result (I am using draw tool to simulate the result)

+0

Добро пожаловать в SO. Вы уже проверяли все похожие вопросы? Как это, например, у вас есть массовые ответы и объяснения: http://stackoverflow.com/questions/26180822/swift-adding-constraints-programmatically –

+0

Я уже проверял этот вопрос. Размер 'UIView' был определен как ширина: 100, высота: 100 в ответе с наивысшей скоростью. Я обновил свой вопрос. Пожалуйста, проверьте, спасибо. – kk777

+0

попробуйте добавить view.layoutIfNeeded после добавления ограничений, если ни одно из других решений не работает для вас или несколько ответов здесь. –

ответ

2

Это пример вида ограничения на нижней части экрана, с высотой, равной 80:

var yourView = UIView() 
yourView.translateAutoresizingMaskIntoConstraints = false 
yourSuperView.addSubview(yourView) 

// Pin the leading edge of yourView to the leading edge of the main view 
yourView.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor).active = true 

// Pin the trailing edge of yourView to the leading trailing edge 
yourView.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor).active = true 

// Pin the bottomedge of yourView to the margin's leading edge 
yourView .bottomAnchor.constraintEqualToAnchor(view.bottomAnchor).active = true 

// The height of your view 
yourView.heightAnchor.constraintEqualToConstant(80).active = true 
+0

Избегайте отправки точных копий вашего ответа на несколько вопросов. Вы можете опубликовать комментарий и ссылку на свой ответ, если вы чувствуете, что вопрос является дубликатом, вы также можете отметить его. –

0

У вас есть две проблемы:

  1. Не комплект self.view.translatesAutoresizingMaskIntoConstraints = false. Вам нужно только установить translatesAutoresizingMaskIntoConstraints для добавляемого подзаголовка.

  2. Вы используете ограничения .greaterThanOrEqual вместо .equal ограничений. Проблема с этим заключается в том, что оставляет много места для маневра, и вы получаете значения, которые заставляют ваш testView иметь ширину 0. Если вы измените на .equal, который будет правильно ограничивать значения.

+0

'testView 'пока не отображается на моем экране после того, как я удалил' self.view.translatesAutoresizingMaskIntoConstraints = false' и изменил '.greaterThanOrEqual' на' .equal' – kk777

+0

Добавляйте обновленный код к вопросу, но не удаляйте исходный код , Вы изменили оба параметра .greaterThanOrEquals на .equal? – vacawama

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