51

在 2011 年的技术演讲中,我看到了一个关于新UIAppearance 协议的演讲。那里还没有很多文档。我将简短地总结一下我记得的内容,以解释我的问题来自哪里:


关于UIAppearance

到目前为止,您必须在所有应用程序视图控制器中自定义每个导航栏(工具栏等)属性。使用新的外观属性,您可以只在一个地方为应用程序中的所有导航栏执行此操作。例如:如果您想自定义导航栏背景图像,您可以这样做:

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

这将设置应用程序中所有导航栏的背景图像。使用barMetrics指定是否要在横向模式下也使用图像。

如果您想指定仅在某些视图控制器中应用的外观,则文档中还有一种方法可以通过指定对象的位置来控制它:

[[UIBarButtonItem appearanceWhenContainedIn:
    [ABPeoplePickerNavigationController class], nil] setTintColor:myNavBarColor];

另外值得一提的是,如果您有单个自定义实例,与您的外观设置不同,这些实例将不受外观代理的影响。


一些问题:

a) 我如何知道类的哪些属性与外观属性一起使用?例如,由于UITableView符合 UIAppearance 协议,我想我可以做类似的事情

[[UITableView appearance] setBackgroundColor:mytableViewColor];

操纵我所有表格视图的背景颜色,但我不能!

b) 是否有所有可使用外观属性操作的类的列表?

c) 在什么时候调用外观定制?我希望在运行时对外观属性进行更改,但不幸的是,这些更改没有发生。

4

3 回答 3

37

a) 我如何知道类的哪些实例与外观属性一起使用?例如,由于 UITableView 符合 UIAppearance 协议,我想我可以做类似的事情

您查看类的标题(以及所有超类的标题)。UI_APPEARANCE_SELECTOR支持在它旁边的任何方法与UIAppearance代理一起使用。

[[UITableView appearance] setBackgroundColor:mytableViewColor];

backgroundColor物业未用UI_APPEARANCE_SELECTORin装饰UIView.h。因此,它在技术上不支持与外观代理一起使用。它可能会起作用,但(鉴于缺乏方法装饰)不能保证。

来自UIAppearance Protocol Reference

为了支持外观定制,一个类必须符合UIAppearanceContainer协议并且相关的访问器方法必须用 标记UI_APPEARANCE_SELECTOR

(注意“相关的访问方法必须标明...”[强调添加])


b) 是否有所有可使用外观属性操作的属性的列表?

是否有一个页面显示与外观代理一起使用的每个设置器?我不知道,也没有办法在运行时构建列表。


c) 在什么时候调用外观定制?我希望在运行时对外观属性进行更改,但不幸的是,这些更改没有发生。

您可以在执行期间的任何时候使用外观代理。-layoutSubviews直到下次调用这些视图的方法时,这些更改才会应用于受影响的视图。

于 2011-11-24T20:14:29.290 回答
4

UIAppearance记录在每个类的标题中。在那里寻找UI_APPEARANCE_SELECTOR最后标记的方法。这些是您可以通过外观代理调用的方法。我不知道标题之外的列表。

在通过代理后立即调用外观定制,以及在构造新对象时立即调用。但这仅适用于标有UI_APPEARANCE_SELECTOR

于 2011-11-24T14:50:11.820 回答
1

a:以下行

 [[UITableView appearance] setBackgroundColor:[UIColor blueColor]];

将使每个表视图都变蓝!刚刚在 iOS 5 模拟器上测试过。

b: UIAppearance 应该适用于 a 上的每个属性UIView。的所有子类都UIView符合UIAppearance Protocol

c:我认为大多数人会创建一个自定义外观并调用它的类和/或方法:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

就像是:[ApplicationAppearance setApplicationSchemaTo:ASchemaBlue];

编辑:

例如, UIBarButtonItem 定义了这些方法:

@property(nonatomic,retain) UIColor *tintColor UI_APPEARANCE_SELECTOR;

来自UIAppearanceContainer 协议参考

UIBarButtonItem Class Reference中定义了 tintColor

@property(nonatomic, 保留) UIColor *tintColor

但是在 UIBarButtonItem.h 中定义了:

@property(nonatomic,retain) UIColor *tintColor __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0) UI_APPEARANCE_SELECTOR;

我认为文档不是最新的。

于 2011-11-24T14:50:21.677 回答