Почему ширина обзора всегда возвращает ноль? - PullRequest
0 голосов
/ 31 марта 2020

Я настраиваю вид программно со всеми ограничениями. Затем я хочу получить его ширину (которая варьируется от устройства к другому), но при печати я всегда возвращаю ноль.

вот мой код:

let myView = UIView()
view.addSubview(myView)
myView.translatesAutoresizingMaskIntoConstraints = false
myView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 15).isActive = true
myView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -15).isActive = true
myView.topAnchor.constraint(equalTo: view.topAnchor, constant: 80).isActive = true
myView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -60).isActive = true
myView.backgroundColor = .blue

let myWidth1 = myView.frame.size.width
let myWidth2 = myView.bounds.width
print(myWidth1)
print(myWidth2)

однако представление на самом деле имеет ширину, как показано на этом скриншоте:

enter image description here

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Для программирования c вы должны создать это представление в loadView(). viewDidLoad() - метод жизненного цикла, который вызывается после загрузки представления в память; однако вид еще не визуализирован. Вы можете получить измерения подпредставления в viewDidLayoutSubviews(), который будет вызываться при всех мутациях вида (например, при изменении ориентации устройства), или метод, подобный viewDidAppear(), который будет вызываться эффективно только один раз.

0 голосов
/ 31 марта 2020

Добро пожаловать в Stackoverflow.

Вы на самом деле просите кадр слишком быстро. Я предполагаю, что представление не было полностью обработано, когда вы пытаетесь напечатать его рамку / границы.

С такой задержкой вы получите правильные значения.

    let myView = UIView()
    view.addSubview(myView)
    myView.translatesAutoresizingMaskIntoConstraints = false
    myView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 15).isActive = true
    myView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -15).isActive = true
    myView.topAnchor.constraint(equalTo: view.topAnchor, constant: 80).isActive = true
    myView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -60).isActive = true
    myView.backgroundColor = .blue

    DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) {
        let myWidth1 = myView.frame.size.width
        let myWidth2 = myView.bounds.width
        print(myWidth1)
        print(myWidth2)
    }

РЕДАКТИРОВАТЬ: как обсуждалось в комментарии, это не должно быть сделано. Этот ответ был опубликован, предполагая, что OP хотел знать причину, по которой значение 0.


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

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