iOS 5:对UIAppearance感到好奇

d.e*_*nis 50 iphone cocoa-touch appearance objective-c ios5

在2011年的技术讲座上,我看到了关于新UIAppearance 协议的演讲.目前还没有很多文档.我将简要总结一下我记得要解释我的问题来自哪里:


关于UIAppearance:

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

[[UINavigationBar appearance] setBackgroundImage:
   [UIImage imageNamed:@"MyImageName"] forBarMetrics:UIBarMetricsDefault]; 
Run Code Online (Sandbox Code Playgroud)

这将设置应用程序中所有导航栏的背景图像.随着barMetrics您可以指定是否要还用在横向模式影像与否.

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

[[UIBarButtonItem appearanceWhenContainedIn:
    [ABPeoplePickerNavigationController class], nil] setTintColor:myNavBarColor];
Run Code Online (Sandbox Code Playgroud)

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


一些问题:

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

[[UITableView appearance] setBackgroundColor:mytableViewColor];
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dav*_*ong 37

a)我如何知道类的哪些实例使用外观属性?例如,因为UITableView符合UIAppearance协议,我认为我可以做类似的事情

您查看类的标题(以及所有超类的标题).UI_APPEARANCE_SELECTOR支持与其相邻的任何方法与UIAppearance代理一起使用.

[[UITableView appearance] setBackgroundColor:mytableViewColor];
Run Code Online (Sandbox Code Playgroud)

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

来自UIAppearance Protocol Reference:

要支持外观自定义,类必须符合UIAppearanceContainer协议,并且必须标记相关的访问器方法UI_APPEARANCE_SELECTOR.

(注意" 相关的访问者方法必须标记......"[强调添加])


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

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


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

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

  • 现在有一份UIAppearance支持课程列表.你可以[见这里](http://blog.mosheberman.com/list-of-classes-that-support-uiappearance-in-ios-5/).可能想要更新你的答案. (3认同)