Перемещение строки состояния в iOS 7
Проблема, с которой я сталкиваюсь, такова:
Я хочу реализовать приложение iOS 7 с красивым дизайном и меню влево/вправо, которое появляется после того, как основной вид оживит себя справа/слева. Я делаю это с кодом [UIView animateWithDuration...]
, но это не очень важно. То, что я хочу достичь, - это тот же эффект, что и для приложения Mailbox iOS 7: для перемещения строки состояния (вправо/влево) с основным видом
Изображение для лучшего объяснения:
![Mailbox app with status bar moved to the side]()
То, что я нашел, это эта статья об этой проблеме с некоторым рабочим кодом с использованием Private API, который я бы не хотел использовать, так как я хочу, чтобы приложение было принято в App Store.
Я хотел бы добиться такого же эффекта ( "юридически" ). Кто-нибудь знает, как это сделать?
Спасибо!
Ответы
Ответ 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;
}
Ответ 4
Я только что создал BSPanViewController, что делает его чрезвычайно простым для достижения этого эффекта. Элемент управления и инструкции по его использованию могут быть найдены на GitHub.
Реализация такая же, как у описанной Саймоном Холроидом.
Ответ 5
По моему опыту, рецензенты App Store, как правило, не заботятся об использовании частного API, особенно это просто и безвредно.
Для задачи вы можете получить указатель на представление строки состояния приложения несколькими способами, которые вы можете найти в полных заголовках iOS, таких как https://github.com/nst/iOS-Runtime-Headers