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:
    }
}