Панель навигации отображается над представлениями с новым iOS7 SDK

CGRect cgRect1 = [[UIScreen mainScreen] applicationFrame];


UISearchBar  *mySearchBar = [[UISearchBar alloc] 
               initWithFrame:CGRectMake(0, 0, cgRect.size.width, 40)];

mySearchBar.autoresizingMask = 
              UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight ;


UITableView  *myTableView = [[UITableView alloc] 
     initWithFrame:CGRectMake(0, 40, cgRect.size.width, cgRect.size.height-40)];

myTableView.autoresizingMask = 
               UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;


[self.view addSubview:mySearchBar];
[self.view addSubview:myTableView];

В более ранних версиях он работает правильно. Строка поиска отображается ниже statusbar и панели навигации. tableview появляется под панелью поиска

Но когда я запускаю это на Xcode 5 sdk iOS 7, строка поиска не видна (я думаю, что она помещена под панель состояния и панель навигации), а также панель навигации появляется над табличным представлением.

Будет ли он исправлен с iOS 7 стабильным выпуском?

Или это проблема моего кодирования?

Или мы должны обрабатывать его, добавляя значение y (y = statubar height + nav bar height) для iOS 7?

Недавно я загрузил Xcode 5 DP для тестирования своих приложений в iOS 7. Первое, что я заметил и подтвердил, - это то, что мои ограничения обзора не всегда изменяются для учета строки состояния и панели навигации.

В viewDidLayoutSubviews я печатаю границы представления:

{{0, 0}, {320, 568}}

В результате мой контент появляется под панелью навигации и строкой состояния.

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

Кто-нибудь еще испытал эту проблему?

UPDATE:

Я нашел решение для этой конкретной проблемы. Установите прозрачное свойство навигационной панели в положение NO:

self.navigationController.navigationBar.translucent = NO;

Это позволит зафиксировать представление под рамкой под панелью навигации и панель состояния.

Однако я не нашел исправления для случая, когда вы хотите, чтобы панель навигации была полупрозрачной. Например, просматривая полноэкранный режим фото, я хочу, чтобы прозрачная панель навигации была прозрачной, а вид под ней был обрамлен. Это работает, но когда я переключаю отображение/скрытие навигационной панели, я испытал еще более странные результаты. Первое подзадача (a UIScrollView) получает свои границы y, которое происходило с каждым изменением.

Ответ 1

Это не совсем так. В iOS 7 появилось новое свойство, позволяющее настроить поведение макета, как в предыдущих версиях iOS. Поместите этот кусок кода в свой контроллер, и вам должно быть хорошо идти! Пространство, которое занимает панель навигации, должно учитываться автоматически

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;

Вам нужно добавить это в свой метод -(void)viewDidLoad.

Примечание. Теперь вы должны использовать последнюю версию GM iOS 7 и Xcode 5 с тех пор, как API изменился с бета-версий.

Ответ 2

Screenshot from storyboard

Если вы работаете в Storyboard (что я настоятельно рекомендую!), это решение: Вы можете отключить "Расширить края" вашего ViewController в раскадровке. Вы должны сделать это для каждого viewController. Вы можете отключить расширенные края, щелкнув значок viewController в stortyboard (помимо productOwner под самим представлением), а затем выбрав инспектор атрибутов (как показано на рисунке).

Это также установит линии выравнивания, такие как iOS 6.

Еще один отличный инструмент в xCode 5 - "Предварительный просмотр": нажмите кнопку "дворецкий" (помощник редактора) и выберите "Предварительный просмотр". там вы можете выбрать iOS 6 и посмотреть, как будет выглядеть ваш дизайн раскадровки на iOS 6.

Его просто отлично: D

[Обновление]

Будьте осторожны: отключение "Расширение границ" может привести к черному свету на панели навигации, когда приложение войдет в фон на iOS7. свечение также будет отображаться в режиме многозадачности (дважды нажмите кнопку "домой" ). это можно решить, установив цвет фона в виде панели навигации на белый.

[self.navigationController.view setBackgroundColor:[UIColor whiteColor]];

Ответ 3

Как говорит OP, есть простое решение для этого, чтобы настроить навигационную панель непрозрачной. Вместо того, чтобы делать это в коде, просто отключите "Прозрачный" для вашей корневой панели навигации:

enter image description here

Ответ 4

self.edgesForExtendedLayout=UIRectEdgeNone;

Он работает на симуляторе iOS 7 (Xcode 5 DP5)

Ответ 5

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

enter image description here

Ответ 6

@Ответ на One Man Crew правильный, но:

Я бы рекомендовал использовать этот код, чтобы избежать ошибок при запуске приложения в старых версиях:

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
     if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
 #endif

Ответ 7

self.edgesForExtendedLayout = UIRectEdgeNone;

И вам нужно сделать это на AppDelegate # application: didFinishLaunchingWithOptions:

self.window.backgroundColor = [UIColor whiteColor];

В противном случае цвет фона панели навигации изменится на серый. Поскольку прозрачная панель навигации перекрывает окно.

Ответ 8

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

CGFloat topLayoutGuide = self.topLayoutGuide.length + self.tabBarController.navigationController.navigationBar.frame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);

Ответ 9

Одним из решений является использование навигационного контроллера. Это автоматически решает проблему. Также используйте Xcode 5 вместо версий Xcode Preview, так как они являются бета-версиями.