首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS 5:对UIAppearance的好奇

iOS 5:对UIAppearance的好奇
EN

Stack Overflow用户
提问于 2011-11-24 13:05:45
回答 3查看 19.3K关注 0票数 50

在2011年的科技讲座上,我看到了一篇关于新的UIAppearance 协议的演讲。目前还没有太多的文档。我将在短期内总结我所记得的内容,以解释我的问题从何而来:

关于UIAppearance**:** UIAppearance**:**的

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

代码语言:javascript
复制
[[UINavigationBar appearance] setBackgroundImage:
   [UIImage imageNamed:@"MyImageName"] forBarMetrics:UIBarMetricsDefault]; 

这将设置应用程序中所有导航条的背景图像。使用barMetrics,您可以指定是否希望图像也在景观模式中使用。

如果您希望指定仅在某些视图控制器中应用的外观,那么在文档中也有一个方法通过指定对象的位置来控制它:

代码语言:javascript
复制
[[UIBarButtonItem appearanceWhenContainedIn:
    [ABPeoplePickerNavigationController class], nil] setTintColor:myNavBarColor];

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

几个问题:

a)如何知道类的哪些属性与外观属性一起工作?,例如,由于UITableView符合UIAppearance协议,所以我认为我可以这样做

代码语言:javascript
复制
[[UITableView appearance] setBackgroundColor:mytableViewColor];

操作所有表视图的背景色,但我做不到!

b)是否有一个所有类的列表,可以对外观属性进行操作?

( c)在什么时候调用外观自定义?I希望进行更改,在运行时抛出外观属性,但不幸的是,更改没有发生。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-24 20:14:29

如何知道类的哪个实例与外观属性一起工作?例如,由于UITableView符合UIAppearance协议,所以我想我可以这样做

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

代码语言:javascript
复制
[[UITableView appearance] setBackgroundColor:mytableViewColor];

backgroundColor属性没有在UIView.h中使用UI_APPEARANCE_SELECTOR进行修饰。因此,技术上不支持在外观代理中使用它。它可能会起作用,但(考虑到缺乏方法装饰)并不一定会起作用。

来自UIAppearance Protocol Reference

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

(注:“相关访问器方法必须标记为.”增加的重点)

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

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

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

您可以在执行过程中的任何点使用外观代理。在下一次调用这些视图的-layoutSubviews方法之前,这些更改不会应用于受影响的视图。

票数 36
EN

Stack Overflow用户

发布于 2011-11-24 14:50:11

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

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

票数 3
EN

Stack Overflow用户

发布于 2011-11-24 14:50:21

答:下面一行

代码语言:javascript
复制
 [[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定义了以下方法: @属性(非原子,保留) UIColor *tintColor UI_APPEARANCE_SELECTOR;

来自UIAppearanceContainer协议参考

UIBarButtonItem类引用中定义了tintColor

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

但是在UIBarButtonItem.h中定义:

代码语言:javascript
复制
@property(nonatomic,retain) UIColor *tintColor __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0) UI_APPEARANCE_SELECTOR;

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8257556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档