Настроить внешний вид UINavigationBar для отображения в CNContactPickerViewController

Я использую приведенный ниже код для настройки внешнего вида моего UINavigationBar, когда он показывает ContactPickerViewController:

 id specialNavBarAppearance = [UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[[CNContactPickerViewController class]]];

    [specialNavBarAppearance setBarTintColor:[UIColor colorWithRed:213/255.0f green:38/255.0f blue:46/255.0f alpha:1.0]];
    [specialNavBarAppearance setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
                                                           [UIColor whiteColor], NSForegroundColorAttributeName,nil]];
    [specialNavBarAppearance setTintColor:[UIColor whiteColor]];

но никаких изменений не появляется. где я не прав?

2 ответа

Я создал категорию для UIViewController настроить внешний вид UINavigationBar только когда вы представляете CNContactPickerViewController Используя метод Swizzling. Перед представлением я проверяю, является ли CNContactPickerViewControllerЗатем мы изменим внешний вид. Затем при увольнении я сбрасываю внешний вид обратно на значения по умолчанию. Это безумное решение, но оно выполняет свою работу.

#import "UIViewController+CustomAppearance.h"
#import <objc/runtime.h>
@import ContactsUI;

@implementation UIViewController (CustomAppearance)

+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    Class class = [self class];

    SEL originalSelector = @selector(presentViewController:animated:completion:);
    SEL swizzledSelector = @selector(presentViewController2:animated:completion:);

    Method originalMethod = class_getInstanceMethod(class, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);

    BOOL didAddMethod =
    class_addMethod(class,
                    originalSelector,
                    method_getImplementation(swizzledMethod),
                    method_getTypeEncoding(swizzledMethod));

    if (didAddMethod) {
        class_replaceMethod(class,
                            swizzledSelector,
                            method_getImplementation(originalMethod),
                            method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }



    SEL originalSelector2 = @selector(dismissViewControllerAnimated:completion:);
    SEL swizzledSelector2 = @selector(dismissViewControllerAnimated2:completion:);

    Method originalMethod2 = class_getInstanceMethod(class, originalSelector2);
    Method swizzledMethod2 = class_getInstanceMethod(class, swizzledSelector2);

    BOOL didAddMethod2 =
    class_addMethod(class,
                    originalSelector2,
                    method_getImplementation(swizzledMethod2),
                    method_getTypeEncoding(swizzledMethod2));

    if (didAddMethod2) {
        class_replaceMethod(class,
                            swizzledSelector2,
                            method_getImplementation(originalMethod2),
                            method_getTypeEncoding(originalMethod2));
    } else {
        method_exchangeImplementations(originalMethod2, swizzledMethod2);
    }

});
}

#pragma mark - Method Swizzling

- (void)dismissViewControllerAnimated2:(BOOL)flag completion:(void (^)(void))completion
{
   [self setupDefualtAppearance];

   [self dismissViewControllerAnimated2:flag completion:completion];
}



 - (void)presentViewController2:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion {

  if ([viewControllerToPresent isKindOfClass:[CNContactPickerViewController class]]) {
    [self setupContactsPickerAppearance];

 }
    [self presentViewController2:viewControllerToPresent animated:flag completion:completion];
 }


 - (void)setupDefualtAppearance{

    id specialNavBarAppearance = [UINavigationBar appearance];

    [specialNavBarAppearance setBarTintColor:nil];
    [specialNavBarAppearance setTitleTextAttributes: nil];
    [specialNavBarAppearance setTintColor:nil];
  }


  - (void)setupContactsPickerAppearance{
     id specialNavBarAppearance = [UINavigationBar appearance];

     [specialNavBarAppearance setBarTintColor:[UIColor colorWithRed:213/255.0f green:38/255.0f blue:46/255.0f alpha:1.0]];
     [specialNavBarAppearance setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
                                                  [UIColor whiteColor], NSForegroundColorAttributeName,nil]];
     [specialNavBarAppearance setTintColor:[UIColor whiteColor]];
   }

   @end

UINavigationBar всегда в UINavigationController, Вы не должны использовать UINavigationController appearance контролировать это.

Другие вопросы по тегам