iOS 7 - строка состояния перекрывает вид

У меня есть ViewController, который находится внутри UINavigationcontroller, но панель навигации скрыта. Когда я запускаю приложение на iOS 7, в верхней части окна отображается строка состояния. Есть ли способ избежать этого?

Я не хочу писать какой-либо код для конкретной ОС.

Введите описание изображения здесь

Я попытался установить для View controller-based status bar appearance значение NO, но это не решило проблему.

108 голосов | спросил aryaxt 13 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 13 Sep 2013 03:29:05 +0400 2013, 03:29:05

14 ответов


0

Xcode 5 содержит iOS 6/7 Deltas, который специально создан для решения этой проблемы. В раскадровке я переместил свои представления на 20 пикселей вниз, чтобы посмотреть прямо на iOS 7, и чтобы сделать его совместимым с iOS 6, я изменил Delta y до -20.

введите описание изображения здесь

Поскольку в моей раскадровке не используется автоматическая разметка, для правильного изменения высоты просмотра в iOS 6 необходимо было установить Delta height а также Delta Y.

ответил aryaxt 14 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 14 Sep 2013 00:55:46 +0400 2013, 00:55:46
0

Если вы просто НЕ хотите какой-либо строки состояния, вам нужно обновить свой список с этими данными: Для этого в plist добавьте эти 2 настройки:

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

В iOS 7 вы должны разработать свое приложение с наложенной прозрачной строкой состояния. Посмотрите, например, новое приложение iOS 7 Weather.

ответил Nathan H 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 15 Sep 2013 15:08:48 +0400 2013, 15:08:48
0

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

Если у вас есть UIViewController внутри UINavigationController и навигационная панель видна, вы можете иметь следующий код в вашем viewDidLoad или иметь фоновое изображение для навигационной панели.

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;
}
ответил Vincent 13 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 13 Sep 2013 04:09:27 +0400 2013, 04:09:27
0

Единственное рабочее решение, которое я сделал сам.

Вот мой подкласс UIViewController https://github.com/comonitos/ios7_overlaping

1 подкласс от UIViewController

2 Подкласс вашего window.rootViewController из этого класса.

3 Вуаля!

- (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];
}
ответил comonitos 4 +04002013-10-04T13:34:26+04:00312013bEurope/MoscowFri, 04 Oct 2013 13:34:26 +0400 2013, 13:34:26
0
-(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);
    }
  }
}

Add Key in plist --- Просмотр внешнего вида строки состояния контроллера: НЕТ

ответил Darshit Shah 24 TueEurope/Moscow2013-12-24T14:18:42+04:00Europe/Moscow12bEurope/MoscowTue, 24 Dec 2013 14:18:42 +0400 2013, 14:18:42
0

Чтобы скрыть строку состояния в ios7, выполните следующие простые действия:

В Xcode перейдите к «Resources» и откройте папку «(app name)-Info.plist file»

  • проверьте ключ "View controller based status bar appearance" и установите его значение "NO "
  • проверьте ключ "Status bar is initially hidden" и установите его значение "YES "

Если ключей там нет, вы можете добавить их, выбрав "information property list" вверху и нажав + значок

ответил Mandeep Pasbola 15 Jpm1000000pmWed, 15 Jan 2014 17:27:28 +040014 2014, 17:27:28
0

Если вы хотите полностью скрыть это и просто не иметь с этим дело, это хорошо работает.

-(BOOL) prefersStatusBarHidden
{
    return YES;
}

ссылка https://stackoverflow.com/a/18873777/1030449

ответил Kalel Wade 5 22013vEurope/Moscow11bEurope/MoscowTue, 05 Nov 2013 23:42:22 +0400 2013, 23:42:22
0

Если вы используете xib, очень простая реализация заключается в инкапсуляции всех подпредставлений в представлении контейнера с флагами изменения размера (которые вы уже будете использовать для совместимости 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 и оставить его на весь экран.

ответил tipycalFlow 8 52013vEurope/Moscow11bEurope/MoscowFri, 08 Nov 2013 10:48:17 +0400 2013, 10:48:17
0

Это все, что нужно для удаления строки состояния. введите описание изображения здесь

ответил Tony 5 ThuEurope/Moscow2013-12-05T01:59:03+04:00Europe/Moscow12bEurope/MoscowThu, 05 Dec 2013 01:59:03 +0400 2013, 01:59:03
0

Для панели навигации:

Написание этого кода:

self.navigationController.navigationBar.translucent = NO;

только что помог мне.

ответил CoderSaru 7 42013vEurope/Moscow11bEurope/MoscowThu, 07 Nov 2013 13:34:00 +0400 2013, 13:34:00
0

Ответ Винсента 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
}
ответил RamaKrishna Chunduri 1 +04002013-10-01T15:08:54+04:00312013bEurope/MoscowTue, 01 Oct 2013 15:08:54 +0400 2013, 15:08:54
0

Я отправил свой ответ на другой пост с тем же вопросом, что и этот.

Из руководства по переходу на 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.

ответил Liangjun 24 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 24 Sep 2013 07:12:47 +0400 2013, 07:12:47
0

Если вы хотите, чтобы «Использовать автоматическую разметку» включалось любой ценой, поместите следующий код в viewdidload.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) 
{
        self.edgesForExtendedLayout = UIRectEdgeNone;
        self.extendedLayoutIncludesOpaqueBars = NO;
        self.automaticallyAdjustsScrollViewInsets = NO;
}
ответил Ali Shahid 26 +04002013-10-26T11:50:28+04:00312013bEurope/MoscowSat, 26 Oct 2013 11:50:28 +0400 2013, 11:50:28
0

Моя строка состояния и панель навигации перекрываются после возврата из альбомной ориентации 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;
        }
    }
}

Просто вызывайте эту функцию всякий раз, когда вы хотите зафиксировать положение панели навигации. Я вызвал playerView:didChangeToState:

в YTPlayerViewDelegate
- (void)playerView:(YTPlayerView *)playerView didChangeToState:(YTPlayerState)state {
    switch (state) {
        case kYTPlayerStatePaused:
        case kYTPlayerStateEnded:
            [self fixNavigationBarPosition];
            break;
        default:
    }
}
ответил John Pang 13 SunEurope/Moscow2015-12-13T00:20:06+03:00Europe/Moscow12bEurope/MoscowSun, 13 Dec 2015 00:20:06 +0300 2015, 00:20:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132