Строка состояния отображается поверх границ моего представления в iOS 7

Я попытался протестировать свое приложение в iOS 7, а затем обнаружил, что мое представление появляется в строке состояния... Когда я читал, в iOS 7 строка состояния скрыта. Итак, как мне сделать его совместимым для запуска как в iOS 6, так и в iOS 7? Должен ли я создавать разные .xib файлы для разных версий iOS для каждого экрана?

Я читал это: Если обе версии стандартного приложения должны иметь аналогичный макет, используйте "Автоматический макет" для создания пользовательского интерфейса, который корректно работает в обеих версиях iOS. Чтобы поддерживать несколько версий iOS, укажите один набор ограничений, которые Auto Layout может использовать для настройки представлений и элементов управления в файлах раскадровки или XIB (чтобы узнать больше о ограничениях, см. "Ограничения на соответствие отношениям между представлениями" ).

Если обе версии стандартного приложения должны иметь аналогичный макет, и вы не используете Auto Layout, используйте смещения. Чтобы использовать смещения, сначала обновите пользовательский интерфейс для iOS 7. Затем укажите значения, которые определяют начало, высоту и ширину каждого элемента в более раннем пользовательском интерфейсе в качестве смещений из новой позиции элементов в iOS 7 UI.

Но когда я использую autolayout в .xib, он показывает ошибку, что автозапуск находится в предыдущей версии iOS 6.

Как исправить эту проблему?

Ответ 1

iOS 7, по-видимому, поддерживает отображение строки состояния для некоторых видов, но не для других. Чтобы скрыть его для всех видов, выполните следующие действия:

  • Убедитесь, что Hide during application launch по-прежнему отмечен, чтобы поддерживать предыдущие версии ОС.
  • В вашем файле Info.plist добавьте View controller-based status bar appearance и установите его в NO.
  • Возможно, вам понадобится "Очистить" перед созданием (я сделал), но тогда ваше приложение должно работать по-прежнему: никакая строка состояния не висит над вашими взглядами!

Ответ 2

Вероятно, вам нужно добавить следующий код на каждый контроллер представления.

- (void)viewDidLoad
{
    [super viewDidLoad];
    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)])
    {
        [self prefersStatusBarHidden];
        [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
    }
    else
    {
        // iOS 6
        [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
    }
}

// Add this method
- (BOOL)prefersStatusBarHidden {
    return YES;
}

Ответ 3

У меня такая же проблема. Пока я сделал два взлома и решит, с чем поеду:

  • Вы можете полностью скрыть строку состояния, установив для параметра UIStatusBarHidden и UIViewControllerBasedStatusBarAppearance значение true.
  • В моем приложении я создал ограничение Top Spacing со значением 0, и я программно изменил его на 20, если обнаружил, что приложение работает на iOS 7.

Как сделать учетную запись Autolayout для области состояния?


Ну, я понял это.

В вашем подзадаче (BRSMyListSubViewController в моем случае), в viewDidLoad, вам нужно установить один из этих двух

self.edgesForExtendedLayout = UIRectEdgeNone;
self.automaticallyAdjustsScrollViewInsets = NO;

ИЛИ

self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = YES;

Интересно, что в контроллере корневого представления эти значения установлены по умолчанию UIRectEdgeAll, NO и YES соответственно, но его tableView НЕ находится под навигационной панелью и нижним колонтитулом.

Я не знаю, почему это так нелогично.

Также странно, что edgesForExtendedLayout следует смешивать с одним из двух других свойств, хотя он явно ответственен за поведение.

Ответ 4

Если вы хотите показать строку состояния в разделе iOS 7 с Xcode 5, просто измените порядок кнопок и других подзаголовков, чтобы сделать достаточно места вокруг строки состояния. Но, подождите! Мне тоже нравится iOS 6. Как это сделать?

Я нашел документацию из Apple и нашел в документе название "Поддерживая два варианта стандартного приложения".

Если вы редактируете файл XIB, выберите его и нажмите редактор помощников. Там вы сможете найти "ручное, автоматическое...". Затем выберите "предварительный просмотр".

Enter image description here

Затем вы найдете макет вида бок о бок. Затем вы заметите, что есть кнопка всплывающего окна в правой нижней части правой панели (вид); он говорит "iOS 7 и более поздние". Вы можете выбрать "iOS 6.1 и более ранние версии". Woa! Теперь вы можете внести коррективы для iOS 6.1, не влияя на расположение iOS 7.

Enter image description here

Если вы работаете над раскадрой, это в основном то же самое. Вы выбираете объект контроллера вида и выбираете режим помощника редактора, выбираете "предварительный просмотр", затем "iOS7 и более поздние"... Bluh Bluh Bluh.

Я не уверен, но только помощник-редактор может переключиться на iOS 7 +/iOS 6- mode. Я только что нашел это совсем недавно, поэтому, пожалуйста, укажите, есть ли какие-либо недоразумения или другие трюки.

Ответ 5

Нет необходимости создавать multi-xib. Я думаю, что ваша проблема - "20px": тот же XIB файл отлично смотрится в iOS 6, но он пропускает 20 пикселей в iOS 7.

Например, у вас есть представление, и оно Y = 0. В iOS 6 оно находится рядом со строкой состояния. В iOS 7 он отображается в строке состояния.

Вы должны использовать Xcode 5, чтобы открыть XIB файлы и включить помощник-редактор. Выполните следующие действия:

  • Выберите инспектор файлов и переключите "Просмотр как" на "iOS 7 и более поздние версии"

  • Выберите инспектор размеров и заполните deltaY с помощью "-20"

  • Сделано!

Ответ 6

Вам просто нужно проверить свой основной размер UIView для iOS 7.0 и более поздних версий и iOS 6.0 и ниже, возможно, вы получите представление.

Из iOS 7 Apple изменил размер основного вида = исправлено. Это означает, что если вы добавили панель навигации, на вкладке размер вашего просмотра останется таким же [iPhone 4s: 320 * 480, iPhone 5: 320 * 568].