iOS 5:对UIA外观好奇

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

a)如何知道一个类的哪些实例与外观属性一起工作? 例如,因为UITableView符合UIAppearance协议,所以我想我可以做类似的事情

你看类的头(和所有的超类的标题)。 UIAppearance代理支持使用UI_APPEARANCE_SELECTOR旁边的任何方法。

 [[UITableView appearance] setBackgroundColor:mytableViewColor]; 

backgroundColor属性未用UI_APPEARANCE_SELECTOR中的UIView.h 。 因此在技术上不支持与外观代理一起使用。 它可能会工作,但(由于缺乏方法装饰)不能保证。

UIAppearance Protocol Reference

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

(注意“ 相关的存取方法必须标记…”[着重点])


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

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


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

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

UIAppearance被logging在每个类的头文件中。 在那里查看最后标记为UI_APPEARANCE_SELECTOR方法。 这些是您可以通过外观代理调用的方法。 我不知道标题以外的列表。

在通过代理之后立即调用外观自定义,以及每当构build新对象时。 但是这只适用于标记为UI_APPEARANCE_SELECTOR方法

a:下面一行

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

将使每个表视图蓝色! 刚刚在iOS 5模拟器上testing过。

b:UIAppearance应在UIView上的每个财产上工作。 UIView所有子类都符合UIAppearance Protocol

c:我认为最多的将创build一个类和方法来自定义外观,并将在下面的代码中调用它:

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

例如: [ApplicationAppearance setApplicationSchemaTo:ASchemaBlue];

编辑:

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

@属性(非primefaces,保留)UIColor * tintColor UI_APPEARANCE_SELECTOR;

来自UIAppearanceContainer协议参考

在UIBarButtonItem类参考中定义了tintColor

@property(nonatomic,retain)UIColor * tintColor

但是在UIBarButtonItem.h中定义了:

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

我认为这些文件不是最新的。