Подтвердить что ты не робот

Перемещение строки состояния в iOS 7

Проблема, с которой я сталкиваюсь, такова:

Я хочу реализовать приложение iOS 7 с красивым дизайном и меню влево/вправо, которое появляется после того, как основной вид оживит себя справа/слева. Я делаю это с кодом [UIView animateWithDuration...], но это не очень важно. То, что я хочу достичь, - это тот же эффект, что и для приложения Mailbox iOS 7: для перемещения строки состояния (вправо/влево) с основным видом

Изображение для лучшего объяснения:

Mailbox app with status bar moved to the side

То, что я нашел, это эта статья об этой проблеме с некоторым рабочим кодом с использованием Private API, который я бы не хотел использовать, так как я хочу, чтобы приложение было принято в App Store.

Я хотел бы добиться такого же эффекта ( "юридически" ). Кто-нибудь знает, как это сделать?

Спасибо!

4b9b3361

Ответ 1

Суть его в том, чтобы использовать этот метод, введенный в iOS 7:

https://developer.apple.com/documentation/uikit/uiscreen/1617814-snapshotview:

С этим вы получаете UIView, содержащий скриншот, который включает строку состояния. Как только у вас есть это, это просто вопрос скрыть ваш текущий вид, а затем нажать на экран снимок экрана.

Я опубликовал здесь доказательство концепции: https://github.com/simonholroyd/StatusBarTest

ПРИМЕЧАНИЕ Я не отправил код, который делает это через процесс проверки Apple, но это не частный метод API.

Ответ 2

Итак, после первоначального нажатия г-на Саймона Холройда и некоторых поисков я нашел решение, как достичь этой "эффекта". Это код:

statusbarView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)];

EDIT: mister pcholberg правильно указал, что прежний код не работал на самом устройстве, только на симуляторе iOS, поэтому я отредактировал его по его рекомендации

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
    UIView *screenShot = [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:NO];
    [statusbarView addSubview:screenShot];
    [statusbarView setClipsToBounds:YES];
    [self.view addSubview:statusbarView];

    [self setPrefersStatusBarHidden:YES];
    [self prefersStatusBarHidden];
    [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
}

...

- (BOOL)prefersStatusBarHidden
{
    return prefersStatusBarHidden;
}

...


Таким образом, первая часть создает контекст, использует метод, упомянутый Саймоном, рисует представление с помощью строки состояния и сохраняет это как UIImage

Вторая часть добавляет моментальный снимок UIView к моему viewController UIView

И третья часть устанавливает мой bool для строки состояния в YES (для более простого использования в методе выше) и вызывает методы для его перерисовки

Затем он устанавливает UIView как не-функциональную строку состояния на своем месте и скрывает исходную, поэтому нет двойной рендеринга. Затем я могу использовать это представление в моем методе [UIView animateWithDuration...

И когда я вернусь, я использую этот код в обработчике завершения блока анимации:

[statusbarView removeFromSuperview];

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{

    [self setPrefersStatusBarHidden:NO];
    [self prefersStatusBarHidden];
    [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];

}

И вой! Это работает как описанный эффект в моем вопросе.

Надеюсь, это поможет кому-то!

Ответ 3

Я использую этот метод для перемещения statuebar со слайдером, в приложении есть два окна, одно нормальное окно, другое statuBarWindow, я получаю statuBarView, который superView является statuBarWindows, и перемещает его со слайдером.

- (UIView *)statuBarView
{
    NSString *key = [[NSString alloc] initWithData:[NSData dataWithBytes:(unsigned char []){0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x61, 0x72} length:9] encoding:NSASCIIStringEncoding];
    id object = [UIApplication sharedApplication];
    UIView *statusBar = nil;
    if ([object respondsToSelector:NSSelectorFromString(key)]) {
        statusBar = [object valueForKey:key];
    }
    return statusBar;
}

Ответ 5

По моему опыту, рецензенты App Store, как правило, не заботятся об использовании частного API, особенно это просто и безвредно. Для задачи вы можете получить указатель на представление строки состояния приложения несколькими способами, которые вы можете найти в полных заголовках iOS, таких как https://github.com/nst/iOS-Runtime-Headers