在2011年科技讲座上,我看到了一篇关于新UIAppearance protocol的演讲.目前还没有太多的文档.我将简要总结一下我记得要解释的问题的来源:


About 100:

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

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

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

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

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

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


Some questions:

a) How do I know which properties of a class work with the appearance property?例如,由于UITableView符合UIAppearance协议,我想我可以这样做

[[UITableView appearance] setBackgroundColor:mytableViewColor];

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

b) Is there a list of all classes that are manipulatable with the appearance property?

c) At what point is the appearance customization being called?我希望在运行时对外观属性进行更改,但不幸的是更改没有发生.

推荐答案

a) 如何知道类的哪些实例使用了appearance属性?例如,由于UITableView符合UIAppearance协议,我想我可以做如下事情

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

[[UITableView appearance] setBackgroundColor:mytableViewColor];

backgroundColor号房产没有装饰UI_APPEARANCE_SELECTOR/UIView.h.因此,它在技术上不支持与外观代理一起使用.它可以工作,但(考虑到缺乏装饰方法)不能保证.

UIAppearance Protocol Reference人中:

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

(注"应标记and个相关访问器方法……"[重点补充])


b) 是否有可通过外观属性进行操作的所有属性的列表?

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


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

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

Objective-c相关问答推荐

恢复 iOS7 之前的 UINavigationController pushViewController 动画

覆盖@property setter 和无限循环

iOS8:退出应用程序后不久出现蓝条正在使用您的位置

将 NSArray 保存到 NSUserDefaults 并在 NSMutableArray 中获取它

tableView:canEditRowAtIndexPath: 弹出 viewController 时崩溃

在 Objective C 中将属性标记为已弃用

使用 ARC,什么更好:alloc 或 autorelease 初始化程序?

获取对 UIApplication 委托的引用

参考代码中的内部版本号或版本号

设置数据后调整 UICollectionView 单元格的大小

如何四舍五入浮点值?

UIFont 的磅值到底是多少?

iPhone - 时区便利方法之间的差异

Cocoa 与 Cocoa Touch - 有什么区别?

如何在 ios 8 的 alertview 中添加文本输入?

Objective-C 的 NSMutableArray 是线程安全的吗?

iOS是静态框架还是动态框架?

交换 NSMutableArray 中的元素

检测 UITableView 滚动

在 iPhone 上查找用户的 Documents 目录的最佳方法是什么?