Панель UINavigationController покрывает содержимое своего uiviewcontroller

У меня есть UIViewController, MyViewController, с UIToolbar вверху. При использовании построителя интерфейса схема документа выглядит так:

View 
  - subview1
  - subview2
  - UIToolbar
     - Bar Button Item1
     - Bar Button Item2
     - Bar Button Item3

MyViewController используется во всем моем приложении. Иногда это в UINavigationcontroller, иногда в UIPopoverView.

Когда он появляется в UINavigationController, панель навигации закрывает UIToolbar и весь другой контент в верхней части View. На этом снимке экрана вы можете видеть, что UIToolbar полностью закрыт, а UIButton с изображением зеленого лампочка прикрыта частично.

Согласно документации Apple

Любое представление, которое необходимо привязать к верхней части и чуть ниже строки состояния (например, UIToolbar, UIButton и т. Д.), Требует дополнительной работы для правильного размещения.

Он переходит к решению, которое просто использует ограничения для перемещения содержимого вашего VC вниз на x пикселей, в моем случае это UIToolbar. Это не кажется хорошим решением, поскольку предполагает, что вы всегда хотите, чтобы контент перемещался вниз под панелью навигации. В моем случае, очевидно, нет, поскольку MyViewController не всегда находится в UINavigationController. Когда я использую решение ограничения, представленное в этих документах, UIToolbar странным образом плавает вниз на x пикселей без привязки сверху во всех случаях, когда MyViewController не находится в UINavigationController.

Мне что-то не хватает в том, как я должен отображать содержимое VC в UINavigationController? Большое спасибо.


person roro    schedule 27.12.2013    source источник
comment
не могли бы вы дать код   -  person ipinak    schedule 28.12.2013
comment
@ipinak Я добавил детали схемы документа и снимок экрана, но на самом деле здесь нет никакого кода, кроме чего-то вроде [navcntrl push: MyViewController]. Все это работает в конструкторе интерфейсов. Пожалуйста, дайте мне знать, если я могу предоставить дополнительную информацию, которая была бы полезна. Спасибо,   -  person roro    schedule 28.12.2013
comment
На какой версии iOS вы работаете?   -  person ldindu    schedule 28.12.2013


Ответы (4)


В iOS7 UINavigationBar имеет свойство translucent, а представления дочерних VC UINavigationViewController по умолчанию находятся под UINavigationBar.

Если вам не нужен этот полупрозрачный эффект, отключите это свойство с помощью следующего кода.

self.navigationController.navigationBar.translucent = NO

Вы также можете использовать способ @ldindu.

person Kyokook Hwang    schedule 28.12.2013
comment
Это делает эту полосу полностью прозрачной. Если вы этого не хотите, вам может потребоваться настроить его свойство backgroundcolor, чтобы изменить его на любой нужный вам цвет (включая частичную непрозрачность). - person ecume des jours; 29.09.2014

Если вы используете версию iOS 7.0, вам необходимо установить следующее свойство, которое недавно появилось в iOS 7.0, как показано ниже.

self.edgesForExtendedLayout = UIRectEdgeNone; 

поскольку по умолчанию для свойства EdgeForExtendedLayout установлено значение UIRectEdgeAll, что означает, что контроллеры представления по умолчанию используют полноэкранный макет.

person ldindu    schedule 28.12.2013
comment
Это лучший ответ, имхо - person pixelfreak; 07.06.2015

Определите, используете ли вы iOS 7.

#define IS_IOS7 [[[UIDevice currentDevice] systemVersion] hasPrefix:@"7"];

- (float)topPadding
{
    return (IS_IOS7) ? 20.0f : 0.0f;
}

Увеличьте ось Y кадра на [self topPadding], чтобы переместить его дальше вниз.

Надеюсь, ваша проблема решена.

person ipinak    schedule 27.12.2013

Если написано на Swift, это edgesForExtendedLayout = UIRectEdge()

person Rachel    schedule 15.11.2016