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

Модальная строка состояния и цвета текста навигационной панели от 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, и не повезло изменить цвет строки состояния вообще. Любые идеи?

4b9b3361

Ответ 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];