iOS 5:对UIAppearance感到好奇

时间:2011-11-24 13:05:45

标签: iphone objective-c cocoa-touch ios5 appearance

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


关于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)在什么时候调用外观自定义?我希望在运行时更改抛出外观属性,但不幸的是没有进行更改。

3 个答案:

答案 0 :(得分:37)

  

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

的事情

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

[[UITableView appearance] setBackgroundColor:mytableViewColor];

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

来自UIAppearanceContainer

  

要支持外观自定义,类必须符合UI_APPEARANCE_SELECTOR协议,相关的访问者方法必须标有-layoutSubviews

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


  

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

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


  

c)在什么时候调用外观定制?我希望在运行时更改抛出外观属性,但遗憾的是没有进行更改。

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

答案 1 :(得分:4)

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

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

的方法

答案 2 :(得分:2)

a:以下一行

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

会让每张桌子看起来都是蓝色的!刚刚在iOS 5模拟器上测试过。

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

c:我认为最多会创建一个类和/或方法来自定义外观并将其调用:

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

类似于:[ApplicationAppearance setApplicationSchemaTo:ASchemaBlue];

编辑:

  

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

     

@property(非原子,保留)UIColor * tintColor UI_APPEARANCE_SELECTOR;

来自UIAppearanceContainer Protocol Reference

UIBarButtonItem Class Reference中定义了tintColor

  

@property(非原子,保留)UIColor * tintColor

但是在UIBarButtonItem.h中定义了:

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

我认为文档不是最新的。