12

У меня есть ViewController (B), который обрабатывается с помощью PageViewController, который находится внутри другого ViewController (A), и откройте его модальным. Я сосредоточил ViewController (B) точно в середине экрана. Это прекрасно работает.Получить высоту рамки без высоты навигационной панели и высоты панели табуляции в иерархии более глубокого обзора.

Но когда я нажимаю ViewController (A) из NavigationController, кадр ViewController (B) имеет большой размер и простирается ниже NavigationBar и TabBar. Но я хочу, чтобы это было сосредоточено между NavigationBar и TabBar.

Я знаю, как я могу получить высоту навигационной панели и TabBar, чтобы я мог изменить размер ViewController (B):

var topBar = self.navigationController?.navigationBar.frame.height 
var bottomBar = self.tabBarController?.tabBar.frame.height 

Но это не работает глубоко в иерархии Vier в ViewController (B) , self.navigationController и self.tabBarController равны нулю. Итак, как я могу получить высоту панели навигации и вкладки в иерархии представлений? Или мне просто нужно передать его с одного ViewController на другой, пока я не получу ViewController (B)? Или есть еще один более очевидный способ сосредоточить взгляд? Благодарю.

(я попытался опубликовать скриншоты для лучшего понимания, но мне не хватает необходимых очков репутации размещать фото, извините)

+0

Try 'yourview.bounds' после viewDidAppear. – Elto

+0

Оценки не дают мне topLayoutGuide и/или bottonLayoutGuide – Darko

+0

Если вы открыли контроллер вида по модулю, это не ребенок контроллера с панелью вкладок, поэтому self.tabBarController равен нулю. Он находится над ним в стеке навигации. Вам нужно будет передать эту информацию, например, в режиме подготовки (для segue :). Если вы открыли модально, то почему вы хотите, чтобы пользователь подумал, что они могут щелкнуть по кнопкам вкладки (которых они, вероятно, не могут)? Может быть, вы не хотите открывать модально. – RowanPD

ответ

-11

Navigation высота бар высота строки состояния и высота панели вкладок всегда постоянна:

  1. Навигационная панель - 44pts
  2. Status bar - 20pts
  3. Tab bar - 49pts.

Вы можете напрямую вычесть эти константы с высоты зрения: self.view.frame.size.height- (44 + 20 + 49)

+0

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

+1

Это тоже неправильно. Строка состояния составляет 40 очков во время телефонного разговора. –

+1

@ DylanGattey Это не так, пожалуйста, сначала прочитайте вопрос, нет ссылки на телефонный звонок. –

21

Используйте это:

let height = UIApplication.sharedApplication().statusBarFrame.height + 
self.navigationController!.navigationBar.frame.height 

эта поддержка портрет и пейзаж.

+0

В этой ситуации navigationController == ноль – Darko

+0

Обновлено: 'UIApplication.shared.statusBarFrame.height + self.navigationController .navigationBar.frame.height' –

3

Для UITabBar, этот код работы:

self.tabBarController?.tabBar.frame.height 
+0

В этой ситуации tabBarController == ноль – Darko

0

Для Swift 3

navBarHeight = (self.navigationController?.navigationBar.intrinsicContentSize.height)! 
+ UIApplication.shared.statusBarFrame.height 
+0

В этой ситуации navigationController == ноль – Darko

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