【问题标题】:iOS 5: Curious about UIAppearanceiOS 5:对 UIAppearance 感到好奇
【发布时间】:2012-01-05 15:39:03
【问题描述】:

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

【问题讨论】:

  • 我在这里 (stackoverflow.com/q/9424112/245265) 提出了您的问题 b) 并提供了答案。我这样做是因为我觉得你的问题标题太笼统,没有人能找到我繁琐编制的清单。

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


【解决方案1】:

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

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

的方法

【讨论】:

  • “通过后扔代理”是什么意思?在按下未解决更改的按钮后,我尝试更改外观。在传递另一个视图并返回后,应用了更改。所以我开始相信,当视图层次结构发生变化或布局方法被调用时,这些变化就完成了。
【解决方案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(nonatomic,retain) UIColor *tintColor UI_APPEARANCE_SELECTOR;

来自UIAppearanceContainer Protocol Reference

UIBarButtonItem Class Reference 中定义了tintColor

@property(nonatomic, retain) UIColor *tintColor

但是在UIBarButtonItem.h中是定义的:

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

我认为文档不是最新的。

【讨论】:

  • 我不会依赖 setBackgroundColor 在这个系统中工作。它在文档中没有被标记为 UI_APPERANCE_SELECTOR,并且可以随时中断。
  • 我认为文档没有更新。我将编辑并解释原因。
  • 在 UITableView YES 你是写的,在 UIView 也没有 UI_APPEARANCE_SELECTOR
  • a) 这很奇怪,它不适合我。使用这一行,我只能在调用它的表格视图中获得蓝色的背景颜色。
  • c) 没有。在调用application:didFinishLaunchingWithOptions: 后,我可以通过将语句放置在运行时呈现的不同视图中来更改外观。发布此视图后,我看到所做的更改在所有其他视图中都出现了
【解决方案3】:

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

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

[[UITableView appearance] setBackgroundColor:mytableViewColor];

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

来自UIAppearance Protocol Reference

要支持外观自定义,类必须符合UIAppearanceContainer 协议,并且相关的访问器方法必须标有UI_APPEARANCE_SELECTOR

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


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

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


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

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

【讨论】:

  • 现在有一个 UIAppearance 支持类的列表。你可以see it here。可能想更新你的答案。
  • C) 我发现直到下一次应用 -layoutSubviews 在下一个运行循环中才会应用更改。还有其他人遇到这种情况吗?
猜你喜欢
  • 2013-09-07
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 2013-03-27
相关资源
最近更新 更多