IOS 7 - Строка состояния перекрывает представление
У меня есть ViewController
, который находится внутри UINavigationcontroller
, но navigationBar скрыт. Когда я запускаю приложение на iOS 7, строка состояния отображается поверх моего представления. Есть ли способ избежать этого?
Я не хочу писать какой-либо конкретный код ОС.
![Enter image description here]()
Я попробовал установить View controller-based status bar appearance
на NO
, но это не устранило проблему.
Ответы
Ответ 1
Xcode 5 имеет iOS 6/7 Deltas
специально разработанный для решения этой проблемы. В раскадровке я переместил свои взгляды на 20 пикселей вниз, чтобы посмотреть на iOS 7, и чтобы сделать его совместимым с iOS 6, я изменил Delta y
на -20.
![enter image description here]()
Поскольку моя раскадровка не использует автоматическую компоновку, чтобы изменить высоту представлений на iOS 6, мне пришлось установить Delta height
а также Delta Y
Ответ 2
Если вы просто НЕ хотите никакой строки состояния вообще, вам нужно обновить свой plist этими данными:
Чтобы сделать это, в plist добавьте эти 2 настройки:
<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
В iOS 7 вы должны проектировать свое приложение с наложением прозрачной строки состояния. См. Например, приложение iOS 7 Weather.
Ответ 3
Это поведение по умолчанию для UIViewController
на iOS 7. Представление будет полноэкранным, что означает, что строка состояния будет закрывать верхнюю часть вашего представления.
Если у вас есть UIViewController
в пределах UINavigationController
, и видимость NavigationBar, вы можете иметь следующий код в своем viewDidLoad
или иметь фоновое изображение для navigationBar, сделать трюк.
self.edgesForExtendedLayout = UIRectEdgeNone;
Если у вас скрыта панель навигации, вам необходимо настроить все элементы UIView, сдвинув 20 пунктов. Я не вижу другого решения. Использовать автоматическое расположение поможет немного.
Вот пример кода для обнаружения версии iOS, если вы хотите иметь обратную совместимость.
NSUInteger DeviceSystemMajorVersion() {
static NSUInteger _deviceSystemMajorVersion = -1;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSString *systemVersion = [UIDevice currentDevice].systemVersion;
_deviceSystemMajorVersion = [[systemVersion componentsSeparatedByString:@"."][0] intValue];
});
return _deviceSystemMajorVersion;
}
Ответ 4
Только работающее решение, которое я сделал сам.
Вот мой подкласс UIViewController https://github.com/comonitos/ios7_overlaping
1 Подкласс от UIViewController
2 Подкласс вашего window.rootViewController из этого класса.
3 Voila!
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect screen = [[UIScreen mainScreen] bounds];
if (self.navigationController) {
CGRect frame = self.navigationController.view.frame;
frame.origin.y = 20;
frame.size.height = screen.size.height - 20;
self.navigationController.view.frame = frame;
} else {
if ([self respondsToSelector: @selector(containerView)]) {
UIView *containerView = (UIView *)[self performSelector: @selector(containerView)];
CGRect frame = containerView.frame;
frame.origin.y = 20;
frame.size.height = screen.size.height - 20;
containerView.frame = frame;
} else {
CGRect frame = self.view.frame;
frame.origin.y = 20;
frame.size.height = screen.size.height - 20;
self.view.frame = frame;
}
}
}
}
4 Добавьте это, чтобы сделать вашу строку состояния белой
Сразу после [self.window makeKeyAndVisible];!!!
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}
Ответ 5
-(UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
-(void)viewWillLayoutSubviews{
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7)
{
self.view.clipsToBounds = YES;
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenHeight = 0.0;
if(UIDeviceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))
screenHeight = screenRect.size.height;
else
screenHeight = screenRect.size.width;
CGRect screenFrame = CGRectMake(0, 20, self.view.frame.size.width,screenHeight-20);
CGRect viewFrame1 = [self.view convertRect:self.view.frame toView:nil];
if (!CGRectEqualToRect(screenFrame, viewFrame1))
{
self.view.frame = screenFrame;
self.view.bounds = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
}
}
}
Добавить ключ в plist --- Просмотреть статус панели состояния контроллера: NO
Ответ 6
Чтобы скрыть строку состояния в ios7, выполните следующие простые шаги:
В Xcode перейдите в папку "Resources
" и откройте "(app name)-Info.plist file
".
- установите флажок "
View controller based status bar appearance
" и установите его значение "NO
"
- установите флажок "
Status bar is initially hidden
" и установите его значение "YES
"
Если ключей нет, вы можете добавить их, выбрав "information property list
" сверху и нажмите значок +
Ответ 7
Если вы хотите скрыть это полностью и просто не справиться с этим, это хорошо работает.
-(BOOL) prefersStatusBarHidden
{
return YES;
}
ссылка fooobar.com/questions/21579/...
Ответ 8
Если использовать xib
s, очень простая реализация заключается в инкапсуляции всех подъявлений внутри представления контейнера с помощью флагов изменения размера (которые вы уже будете использовать для 3,5 "и 4" совместимости), чтобы иерархия вида выглядела примерно так: это
![xib heirarchy]()
а затем в viewDidLoad
выполните следующие действия:
- (void)viewDidLoad
{
[super viewDidLoad];
// initializations
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) // only for iOS 7 and above
{
CGRect frame = containerView.frame;
frame.origin.y += 20;
frame.size.height -= 20;
containerView.frame = frame;
}
}
Таким образом, перья не должны быть изменены для совместимости с iOS 7. Если у вас есть фон, его можно сохранить за пределами containerView
и позволить ему закрывать весь экран.
Ответ 9
Это все, что необходимо для удаления строки состояния.
![enter image description here]()
Ответ 10
Для панели навигации:
Написание этого кода:
self.navigationController.navigationBar.translucent = NO;
просто помогло.
Ответ 11
Я отправил свой ответ на другой пост с тем же вопросом с этим.
Из руководства по переходу от Apple iOS7,
https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1
В частности automaticallyAdjustsScrollViewInsets=YES
и set self.edgesForExtendedLayout = UIRectEdgeNone
работает для меня, когда я не хочу перекрываться, и у меня есть tableviewcontroller
.
Ответ 12
Vincent ответить edgeForExtendedLayout работал у меня.
Эти макросы помогают в определении версии ОС, упрощая ее
// 7.0 and above
#define IS_DEVICE_RUNNING_IOS_7_AND_ABOVE() ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending)
// 6.0, 6.0.x, 6.1, 6.1.x
#define IS_DEVICE_RUNNING_IOS_6_OR_BELOW() ([[[UIDevice currentDevice] systemVersion] compare:@"6.2" options:NSNumericSearch] != NSOrderedDescending)
добавьте эти макросы в файл prefix.pch вашего проекта и можно получить доступ в любом месте
if(IS_DEVICE_RUNNING_IOS_7_AND_ABOVE())
{
//some iOS 7 stuff
self.edgesForExtendedLayout = UIRectEdgeNone;
}
if(IS_DEVICE_RUNNING_IOS_6_OR_BELOW())
{
// some old iOS stuff
}
Ответ 13
Если вы хотите, чтобы "Использовать автозапуск" можно было включить с любой ценой, введите следующий код в viewdidload.
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7)
{
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
self.automaticallyAdjustsScrollViewInsets = NO;
}
Ответ 14
Моя строка состояния и панель навигации перекрываются после возврата из ландшафтного представления YTPlayer. Вот мое решение после попытки версии @comonitos, но не работаю на моем iOS 8
- (void)fixNavigationBarPosition {
if (self.navigationController) {
CGRect frame = self.navigationController.navigationBar.frame;
if (frame.origin.y != 20.f) {
frame.origin.y = 20.f;
self.navigationController.navigationBar.frame = frame;
}
}
}
Просто вызовите эту функцию, когда вы хотите исправить положение панели навигации. Я вызвал YTPlayerViewDelegate playerView:didChangeToState:
- (void)playerView:(YTPlayerView *)playerView didChangeToState:(YTPlayerState)state {
switch (state) {
case kYTPlayerStatePaused:
case kYTPlayerStateEnded:
[self fixNavigationBarPosition];
break;
default:
}
}