iOS – UIAppearance appearanceWhenContainedIn 问题

Posted

技术标签:

【中文标题】iOS – UIAppearance appearanceWhenContainedIn 问题【英文标题】:iOS – UIAppearance appearanceWhenContainedIn issues 【发布时间】:2012-08-18 09:13:11 【问题描述】:

我正在为我的导航栏设置一个图像,如下所示:

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navbar.png"] forBarMetrics:UIBarMetricsDefault];

那么我不希望这个图像用于MFMessageComposeViewController 的类,所以我通过这样做来排除它:

[[UINavigationBar appearanceWhenContainedIn:[MFMessageComposeViewController class], nil] setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];

但它没有效果(导航栏仍然使用我在MFMessageComposeViewController 中的图像进行样式设置)。我在这里错过了什么?

【问题讨论】:

【参考方案1】:

找到解决我的问题的方法:

继承MFMessageComposeViewController

在init方法中将navigationBarbackgroundImage设置为nil

瞧!

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) 
        // Custom initialization
        [self.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];

    
    return self;

【讨论】:

这似乎在 ios 7 中无效【参考方案2】:

就在展示 MFMessageComposeViewController 之前尝试

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"MyUINavigationBarImageClear"] forBarMetrics:UIBarMetricsDefault];

并在 messageComposeViewController:didFinishWithResult: 回调中重置为

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"MyUINavigationBarImageFull"] forBarMetrics:UIBarMetricsDefault];

我还设置了 MFMessageComposeViewController 的 .navigationBar.tintColor 属性以获取取消按钮以匹配我的 MyUINavigationBarImageClear 图像。

【讨论】:

【参考方案3】:

这里有两个想法(但未经测试):

1) 我怀疑尝试用 nil 覆盖是行不通的 - 该语句被忽略。我建议你做的是创建一个透明图像,并将其用作 MFMessageComposeViewController 的背景。

2)如果失败了,那么我怀疑必须非常具体地说明何时使用您的图像,因此您必须将第一个语句替换为涵盖整个班级的“何时包含”语句的长列表。如果你有一个所有视图控制器都使用的子类——一些基类——那么我相信你可以使用它。希望 #1 有效!

【讨论】:

不幸的是,#1 没有用,所以我尝试了我的答案,它确实有效。奇怪的是 appearanceWhenContainedIn: 似乎没有任何效果。

以上是关于iOS – UIAppearance appearanceWhenContainedIn 问题的主要内容,如果未能解决你的问题,请参考以下文章

设置控件全局显示样式 appearance

使用UIAppearance自定义iOS UIDatepicker

防止 iOS 7 UINavigationBar 使用 UIAppearance 为 barTintColor 更改设置动画

UIAppearance

iOS 使用UI控件的外观协议UIAppearance进行设置默认UI控件样式

使用 UIAppearance 代理设置 UILabel 样式