2016-06-01 5 views
0

я смотрел на следующий пост для того, чтобы понять, как получить координаты у нижнего края зрения: How get bottom y coordinateКак получить нижний край обзора?

Он говорит, что я могу это сделать: exampleView.frame.maxY

Однако, когда я делаю это Я получаю 0. Вот мой пример:

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

     let thankYouMessage = UILabel() 
     self.view.addSubview(thankYouMessage) 

     thankYouMessage.text = "Thank You for Installing the Keyboard" 
     thankYouMessage.textAlignment = .Center 

     thankYouMessage.snp_makeConstraints { (make) -> Void in 
      make.right.left.top.equalTo(self.view) 
      make.height.equalTo(self.view.frame.height * 0.2) 
     } 

     print(thankYouMessage.frame.maxY) 

     let enableMessage = UILabel() 
     self.view.addSubview(enableMessage) 
     enableMessage.text = "Enable the keyboard here:" 
     enableMessage.textAlignment = .Center 
     enableMessage.backgroundColor = UIColor.blackColor() 

     enableMessage.snp_makeConstraints { (make) -> Void in 
      make.left.equalTo(self.view) 
      make.top.equalTo(self.view).offset(50) 
      make.width.equalTo(self.view.frame.width * 0.3) 
      make.height.equalTo(self.view.frame.height * 0.1) 
     } 




    } 

в print(thankYouMessage.frame.maxY) возвращает 0.

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

+0

Пробовал ли вы второй ответ в этом вопросе? –

ответ

1

Кадр представления не обновляется на основе его ограничений и/или его внутреннего содержимого до тех пор, пока не пройдет прогон макета. Самое раннее, что вы можете получить экранную рамку представления в контроллере представления, находится в методе viewDidLayoutSubviews.

Вы могли бы назвать layoutIfNeeded или sizeToFit на взгляд, прежде чем просить для рамы, но в зависимости от ситуации те, все еще может в конечном итоге дает неправильный ответ, если вызывается в viewDidLoad.

+0

Итак, я бы поместил весь свой код ограничения в метод 'viewDidLayoutSubViews'? – Roymunson

+0

Нет, настройте свои ограничения по-разному. Вы ограничиваете атрибуты константами (например, 'self.view.size.height * 0.2' - это текущий ** размер представления, который затем рассматривается как константа). Вместо этого вы должны ограничивать атрибуты атрибутами. Пример: 'thankYouMessage.heightAnchor.constraintEqualToAnchor (view.heightAnchor, множитель: 0.2) .active = true' –

0

Это произошло потому, что вы создали свой ярлык с нулевым фреймом, и ваше представление не добавлено в иерархию в окне в методе viewDidLoad. Документация гласит, что в представлении viewDidLoad загружен только в память. И в viewWillAppear он добавлен в иерархию в окне. Поместите свою печать в viewWillAppear для проверки или создания UILabel() с фреймом

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