【问题标题】:customize UINavigationBar appearance for showing in CNContactPickerViewController自定义 UINavigationBar 外观以在 CNContactPickerViewController 中显示
【发布时间】:2016-07-10 12:05:11
【问题描述】:

我使用下面的代码来自定义 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]];

但没有出现任何变化。我错在哪里?

【问题讨论】:

  • 您能先确定specialNavBarAppearance 不为零吗?
  • 勾选,它不是零

标签: ios uinavigationbar uiappearance


【解决方案1】:

我为UIViewController 创建了一个类别,以便仅当您使用Method swizzling 呈现CNContactPickerViewController 时自定义UINavigationBar 的外观。在呈现之前,我检查呈现的是不是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

【讨论】:

    【解决方案2】:

    UINavigationBar 始终位于UINavigationController 中。你不应该使用UINavigationController appearance 来控制它。

    【讨论】:

    • 那么我们如何自定义它在特定视图控制器(如 CNContactPickerViewController)中的外观
    猜你喜欢
    • 2017-07-05
    • 1970-01-01
    • 2018-05-10
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 2020-07-19
    相关资源
    最近更新 更多