2016-07-07 4 views
0

Если создать простое приложение, с 1 UIViewController, и я вставлять его в панели навигации, вывод из следующего кодавопросы автоматической компоновки с несколькими раскадровки

override func viewDidAppear(animated: Bool) { 

print ("...app height is \(UIScreen.mainScreen().bounds.height)") 
print ("...win height is \(self.view.frame.size.height)") 

}

результатов в следующее:

...app height is 1024.0 
...win height is 980.0 

вид имеет смысл, я думаю, так как разница в счетах размера для высоты навигационной панели, которая составляет 44 баллов.

Теперь у меня есть проблемы с приложением, которое делает использование нескольких раскадровок, и когда я переход от одного раскадровки к другому, тот же код будет возвращать:

...app height is 1024.0 
...win height is 1024.0 

Странно, так как раскадровки есть uiview, встроенный в контроллер навигации. Это вызывает проблемы с автоматической компоновкой, поскольку размер навигационной панели не учитывается. Однако, если я поворачиваю представление или удаляюсь от него, проблема, похоже, сама решает.

Итак, наконец, вопрос: как я могу обеспечить правильный учет навигационной панели, чтобы не возникало проблем с макетом при навигации между раскадровки? Я пробовал форсировать setNeedsDisplay() и setNeedsLayout() безрезультатно. Любые мысли/идеи/исправления будут оценены.

ответ

0

Если вы хотите, чтобы ваше представление проходило под панелью навигации (т.е. всегда имело ту же высоту, что и экран), установите self.edgesForExtendedLayout = UIRectEdgeAll (Objc-C) и сделайте обратное (нет, чтобы спрятаться за любыми полосами): self.edgesForExtendedLayout = UIRectEdgeNone

EDIT

добавить self.extendedLayoutIncludesOpaqueBars = YES

к сожалению для размещения всего кода в Objective-C, я не очень хорошо знаком с Swift, однако методы должны делать то же самое, что они просто могут определяются разными именами

+0

Спасибо @jackal. Ваш ответ должен работать, но, похоже, моя проблема связана с настраиваемым переходом, настроенным с помощью UIViewControllerAnimatedTransitioning, что нарушает поведение edgeForExtendedLayout. Я объясню ниже. – Plutovman

+0

Это странно ... Я использую пользовательскую анимацию, используя UIViewControllerAnimatedTransitioning. и делает это разрывает edgeForExtendedLayout. Этот [post] (http://stackoverflow.com/questions/33109454/edgesforextendedlayout-ignored-on-ios9-when-using-custom-animation) описывает поведение, которое я вижу. – Plutovman

+0

@Plutovman, все выглядит правильно для меня в этом посте. Я отредактировал свой ответ и добавил недостающую часть, связанную с непрозрачными барами – jackal

0

Я действительно не понимаю причину, по которой это происходит (т. представление, не регистрирующее наличие навигационной панели для установки его размера). Однако, как указывалось в потоке this, изменение размера и регистрация рамок представления, похоже, решают проблему. Добавление следующего кода в viewDidLoad() устраняет проблему:

var viewFrame = self.view.frame 
let viewNavBarHeight = self.navigationController?.navigationBar.frame.height 
viewFrame.origin.y = viewNavBarHeight! 
viewFrame.size.height = viewFrame.height - viewNavBarHeight! 
self.view.frame = viewFrame 
Смежные вопросы