По умолчанию отсутствуют ограничения Autolayout при программном добавлении - PullRequest
0 голосов
/ 18 января 2019

Я забыл добавить x-компонент к моей автопоставке, но я все еще мог видеть представление. Мне было интересно, как / если autolayout генерирует ограничения по умолчанию, когда используется программно, потому что в IB будут ошибки. Для этого в консоли отладки ошибок не выводится.

Я заметил, что когда я не указываю x-компонент, представление всегда будет привязано к его родительскому представлению. Есть ли документация, в которой говорится, что значения по умолчанию, когда ограничение отсутствует?

enter image description here

import UIKit
import PlaygroundSupport
//
class MyViewController : UIViewController {

    override func loadView() {
        let view = UIView()
        view.backgroundColor = .white
        self.view = view
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let outBox = UIView()
        outBox.backgroundColor = UIColor.blue
        view.addSubview(outBox)
        outBox.translatesAutoresizingMaskIntoConstraints = false
        outBox.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        outBox.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        outBox.widthAnchor.constraint(equalToConstant: 200).isActive = true
        outBox.heightAnchor.constraint(equalToConstant: 200).isActive = true

        let inBox = UIView(frame: CGRect(x: 100, y: 2000, width: 10, height: 10))
        inBox.backgroundColor = UIColor.red
        outBox.addSubview(inBox)
        inBox.translatesAutoresizingMaskIntoConstraints = false
        inBox.topAnchor.constraint(equalTo: outBox.topAnchor).isActive = true
        inBox.bottomAnchor.constraint(equalTo: outBox.bottomAnchor).isActive = true
        inBox.widthAnchor.constraint(equalToConstant: 25).isActive = true
        // NO x-constraint component.. Should raise missing constraints error.
    }
}

PlaygroundPage.current.liveView = MyViewController()

1 Ответ

0 голосов
/ 18 января 2019

Ключ здесь не в настройке фрейма

let inBox = UIView(frame: CGRect(x: 100, y: 2000, width: 10, height: 10))

, но здесь

inBox.translatesAutoresizingMaskIntoConstraints = false

эта строка игнорирует внутреннее преобразование фрейма в ограничения и устанавливает их по умолчанию на ноль,Недостаточные ограничения не означают, что вы не можете видеть представление, например, вы можете сделать то же самое в IB и по-прежнему видеть представление с красной рамкой, а также после запуска, но это не значит, что оно установлено правильно, и это как окончательные ограничениябудет преобразован в кадр, так что это совпадение относительно нуля

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...