Панель навигации отображается над представлениями с новым 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, так как они являются бета-версиями.