2015-08-02 3 views
0

У меня есть кнопка, которая имеет ограничение нижнего пробела к Superview с константой 0, которая помещает ее прямо в нижнюю часть экрана. Визуально, когда я запускаю приложение, это именно то, что происходит - кнопка находится в нижней части экрана. В коде я хочу получить frame.origin.y кнопки, чтобы я мог поместить другие объекты программно над кнопкой.UIButton.frame.origin.y - неправильное значение

Рамка.origin.y + frame.height должен равняться высоте экрана, так как он расположен прямо до нижней части, но значения, которые я получаю от проверки рамки UIButton, неверны.

Использование Println, чтобы увидеть значения:

println("HomeBtn starts: \(homeBtn.frame.origin.y)") 
println("HomeBtn height: \(homeBtn.frame.height)") 
println("Screen height: \(self.view.frame.height)") 

Вот результаты ...

На iPhone 6+:

HomeBtn starts: 528.0 
HomeBtn height: 72.0 
Screen height: 736.0 

На iPhone 5:

HomeBtn starts: 528.0 
HomeBtn height: 72.0 
Screen height: 568.0 

На iPad:

HomeBtn starts: 528.0 
HomeBtn height: 72.0 
Screen height: 1024.0 

528 и 72 соответствуют значениям, представленным на HomeBtn в раскадровке/Interface Builder, но с Autolayout и разных размеров устройств, эти значения должны изменяться для каждого устройства.

Есть ли лучшее решение для получения местоположения UIView (будь то кнопка/изображениеView/label/etc) после того, как оно было помещено Autolayout, вместо использования его значений frame.origin и frame.height/width?

+3

Где вы просматриваете информацию о раме? Он недействителен до 'viewDidLayoutSubviews', потому что Auto Layout еще не запущен. – vacawama

+0

@vacawama - правильный ответ! Я все еще использовал viewDidLoad - разместил его как ответ, и я отметю его правильно. Большое спасибо за то, что он ударил меня в голову. =) – RanLearns

ответ

1

Информация о рамах для подземелий не настроена до Автоматическая компоновка работает. Ваша первая возможность увидеть макет подъявлений находится в viewDidLayoutSubviews.

override func viewDidLayoutSubviews() { 
    // Now that the views are all laid out, we can check their positions. 
    println("HomeBtn starts: \(homeBtn.frame.origin.y)") 
    println("HomeBtn height: \(homeBtn.frame.height)") 
    println("Screen height: \(self.view.frame.height)") 
} 
+0

Итак, есть ли лучшая стратегия для установки значений для позиционирования вашего фрейма? viewDidLayoutSubviews вызывается дважды, viewDidLoad - слишком рано, но viewDidAppear может быть слишком поздно, чтобы вызвать код - так, чтобы представления отображались пустым, когда они впервые появляются. – RanLearns

+0

Лучшая стратегия - полностью охватить Auto Layout. Вы можете указать ограничения в коде для новых представлений, которые вы добавляете через код. – vacawama