在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)在什么时候调用外观自定义?我希望在运行时更改抛出外观属性,但不幸的是没有进行更改。
答案 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;
我认为文档不是最新的。