Модальная строка состояния и цвета текста навигационной панели от UIActivityViewControllers в iOS 7
Когда я использую UIActivityViewController
, после того, как пользователь выбирает действие (например, "Почта" или "Сообщение" ), я не могу изменить цвет текста для строки состояния или цвета текста/оттенка навигации "Отмена" и "Отправить" кнопок. Для кнопок панели в AppDelegate
я попытался использовать:
[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
И ничего не происходит. Однако я могу установить заголовок навигационной панели следующим образом:
[[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor], UITextAttributeTextColor, nil]];
Я установил UIViewControllerBasedStatusBarAppearance
в NO
в Info.plist
. И поставьте строку:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
в AppDelegate
, и не повезло изменить цвет строки состояния вообще. Любые идеи?
Ответы
Ответ 1
Поскольку UIActivityViewController представляет базовые диспетчеры представлений модели, мы используем это обходное решение для устранения проблемы с цветом строки состояния:
@interface StatusBarColorApplyingActivityViewController : UIActivityViewController
@end
@implementation StatusBarColorApplyingActivityViewController
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
[super presentViewController:viewControllerToPresent animated:flag completion:^{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
if (completion) {
completion();
}
}];
}
@end
Как вы можете видеть, это просто класс, расширяющий UIActivityViewController, переопределяющий presentViewController:animated:completion:
. Когда контроллер представления был представлен, мы устанавливаем стиль строки состояния через UIApplication в блоке завершения. Затем мы вызываем исходный блок завершения, данный методу, если он есть.
Ответ 2
Вместо подкласса из UIActivityViewController
мы можем изменить tintColor панели навигации после ее представления и вернуть его после завершения в completionHandler
. Например:
UIColor *normalColor = [[UINavigationBar appearance] tintColor];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:dataToShare applicationActivities:nil];
[activityViewController setCompletionHandler:^(NSString *activityType, BOOL completed) {
// back to normal color
[[UINavigationBar appearance] setTintColor:normalColor];
}];
[self presentViewController:activityViewController animated:YES completion:^{
// change color to suit your need
[[UINavigationBar appearance] setTintColor:[UIColor colorWithRed:25.0f/255.0f green:125.0f/255.0f blue:255.0f/255.0f alpha:1.0f]]; // ActionSheet options' Blue color
}];
Ответ 3
Я считаю, что код для изменения цвета панели навигации таков:
[[UINavigationBar appearance] setBarTintColor:[UIColor whiteColor]];
Это касается изменения цветов кнопок панели навигации в iOS 7, если вам это может понадобиться:
[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
И это код, если вы хотите изменить цвета кнопок в iOS 6:
[[UIBarButtonItem appearance] setTintColor:[UIColor redColor]];
Этот код также подходит для iOS 8+, чтобы изменить цвет текста кнопки панели для действий UIActivityViewController (например, совместное использование сообщений или почтового композитора).
Ответ 4
В iOS 8 UIActivityViewController представляет свои индивидуальные контроллеры компоновки в контроллере корневого представления вашего приложения.
Вам необходимо подклассифицировать контроллер корневого представления (будь то UIViewController или UINavigationController) и добавить следующий код.
@interface UINavigationControllerBarColor : UINavigationController
@end
@implementation UINavigationControllerBarColor
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
[super presentViewController:viewControllerToPresent animated:flag completion:^{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
if (completion) {
completion();
}
}];
}
@end
а затем вместо инициализации UINavigationController в AppDelegate или раскадровке, инициализируйте ваш новый подклассовый контроллер.
Некоторые другие рекомендации подкласса UIActivityViewController, но это не работает.
Если вы хотите изменить кнопку панели и цвета заголовка, используйте в своем приложении следующее: didFinishLaunching:
[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
[[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
[UIColor whiteColor], UITextAttributeTextColor,
[UIFont systemFontOfSize:18.0f], UITextAttributeFont,
nil]];
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTintColor:[UIColor whiteColor]];
Ответ 5
Я нашел решение изменить цвет текста кнопок Отправить и Отмена.
Проверьте мой ответ здесь.
Что касается изменения стиля строки состояния с черного на белый, я пробовал практически все, что есть в Stackoverflow, и ничего не работало. Кажется, нет обходного пути.
Одна вещь, которая может работать, но я действительно не знаю, как ее использовать, может изменить стиль строки состояния в контроллере дочернего представления. Там сообщение Stackoverflow об этом здесь.
Это может работать только в том случае, если предположение, что MFMailComposerViewController
и MFMessageComposeViewController
являются контроллерами детского представления UIActivityViewController
, и поэтому, если мы укажем стиль строки состояния для UIActivityViewController
, тогда контроллеры дочерних представлений должны иметь одинаковые стиль строки состояния как родительский.
В методе UIViewController
есть метод childViewControllerForStatusBarStyle
. Здесь - документация Apple для него.
Но я не знаю, как это использовать. Кто-нибудь это понял?
Ответ 6
Вы должны установить tintColor всего приложения.
self.window.tintColor = [UIColor redColor];
или
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
кнопки панели
self.navigationController.navigationBar.tintColor = [UIColor redColor];