Ошибка AutoLayout при привязке вида к основному виду - Swift - PullRequest
0 голосов
/ 07 ноября 2019

потому что у них нет общего предка. Связывает ли ограничение или его привязки элементы в разных иерархиях представления?

override func viewDidLoad() {
        super.viewDidLoad()

        let myContainer = UIView()
        myContainer.backgroundColor = .purple
        myContainer.translatesAutoresizingMaskIntoConstraints = false
        myContainer.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        myContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        myContainer.widthAnchor.constraint(equalToConstant: 200).isActive = true
        myContainer.heightAnchor.constraint(equalToConstant: 200).isActive = true
        self.view.addSubview(myContainer)
}

ОШИБКА:

2019-11-06 20: 06: 17.763701-0600 Тестирование AutoLayout[42202: 4013241] *** Завершение работы приложения из-за необработанного исключения «NSGenericException», причина: «Невозможно активировать ограничение с помощью якорей, и потому что у них нет общего предка. Указывает ли ограничение или его привязки на элементы в разных иерархиях представления? Это недопустимо. '

Если я прокомментирую следующие две строки, ошибка исчезнет, ​​и в левом верхнем углу отобразится представление myContainer.

    //myContainer.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    //myContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true

Любоеидея, почему ошибка, если 'myContainer' - единственное, что у меня есть?

Ответы [ 2 ]

2 голосов
/ 07 ноября 2019

Вы должны добавить представление перед ограничениями

let myContainer = UIView()
self.view.addSubview(myContainer)
myContainer.backgroundColor = .purple
myContainer.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    myContainer.centerYAnchor.constraint(equalTo: view.centerYAnchor),
    myContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor),
    myContainer.widthAnchor.constraint(equalToConstant: 200),
    myContainer.heightAnchor.constraint(equalToConstant: 200)
])

Причина, по которой ограничения width и height проходят, заключается в том, что оба они добавляются в само представление , в то время как centerX и centerY добавляются в родительское представление.

1 голос
/ 07 ноября 2019

Прежде всего вам необходимо добавить представления (один или несколько видов), прежде чем добавить ограничения.

override func viewDidLoad() {
      super.viewDidLoad()
let myContainer = UIView()
self.view.addSubview(myContainer)
myContainer.backgroundColor = .ColorName
myContainer.translatesAutoresizingMaskIntoConstraints = false
addViewConstraints()
}

func addViewConstraints () {
NSLayoutConstraint.activate([
    myContainer.centerYAnchor.constraint(equalTo: view.centerYAnchor),
    myContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor),
    myContainer.widthAnchor.constraint(equalToConstant: 200),
    myContainer.heightAnchor.constraint(equalToConstant: 200)
])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...