2017-02-10 4 views
2

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

import UIKit 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     //addViewStandard() 
     addConstraintsView() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


    func addConstraintsView() { 
     let someView = UIView(frame: CGRect.zero) 
     someView.backgroundColor = UIColor.blue 
     // I want to mimic a frame set of CGRect(x: 20, y: 50, width: 50, height: 50) 
     let widthConstraint = NSLayoutConstraint(item: someView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 50) 
     let heightConstraint = NSLayoutConstraint(item: someView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 50) 
     let leadingConstraint = NSLayoutConstraint(item: someView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1.0, constant: 20) 
     someView.translatesAutoresizingMaskIntoConstraints = false 
     someView.addConstraints([widthConstraint, heightConstraint, leadingConstraint]) 
     view.addSubview(someView) 

    } 
} 

Теперь, когда я запустить приложение он выходит из строя из-за ведущего ограничения. Сообщение об ошибке «Невозможно настроить макет с неподготовленной для ограничения иерархии представлений». Что я здесь делаю неправильно? Должен ли я добавлять ограничения к объекту (синий квадрат в этом случае) или добавлять их в его представление?

EDIT:

После изменения кода у меня есть:

func addConstraintsView() { 
     let someView = UIView(frame: CGRect.zero) 
     someView.backgroundColor = UIColor.blue 
     view.addSubview(someView) 
     someView.translatesAutoresizingMaskIntoConstraints = false 
     let widthConstraint = NSLayoutConstraint(item: someView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 50) 
     let heightConstraint = NSLayoutConstraint(item: someView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 50) 
     let leadingConstraint = NSLayoutConstraint(item: someView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .left, multiplier: 1.0, constant: 20) 
     someView.addConstraints([widthConstraint, heightConstraint]) 
     view.addConstraints([leadingConstraint]) 
    } 

ответ

2

Прежде всего,

view.addSubview(someView) 
someView.translatesAutoresizingMaskIntoConstraints = false 

должны прийти до фазы ограничений; вы должны применить ограничения ПОСЛЕ того, как someView добавляется в его супервизор.

Кроме того, если вы ориентируетесь IOS 9, я бы посоветовал вам использовать макет якоря, как

let widthConstraint = someView.widthAnchor.constraint(equalToConstant: 50.0) 
let heightConstraint = someView.heightAnchor.constraint(equalToConstant: 50.0) 
let leadingConstraint = someView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20.0) 
NSLayoutConstraint.activate([widthConstraint, heightConstraint, leadingConstraint]) 

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

В заключение (и чтобы устранить ваши сомнения), если вы не можете использовать привязки компоновки, вы должны добавить главное ограничение к супервизу, а не к виду.

+0

Это помогло. Теперь работает! Благодаря! – KexAri

+0

Это было мое удовольствие! –