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;
我认为这些文件不是最新的。