7

我的应用程序中有一个 UIWebView,问题是我有一个 UIAppearance 可以修改分段控件的外观,因此它会修改 UIWebView 文本字段的输入附件视图中的分段控件,我希望它看起来正确,或不尝试修改它。这是它目前的样子:

在此处输入图像描述

4

2 回答 2

5

我刚刚通过使用 [UIAppearance appearanceWhenContainedIn:] 而不是 [UIAppearance appearance] 为自己解决了这个问题。

通过向选择器发送包含您要自定义的元素的所有自定义 ViewController 类的零终止列表来使用它。所以而不是

[[UISegmentedControl appearance] setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

利用

[[UISegmentedControl appearanceWhenContainedIn:[MyViewController class], [MyOtherViewController class], nil] setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

你不需要列出所有的 ViewControllers,只需要列出你的顶级 ViewControllers。这也使得以下技巧成为可能:创建 UIViewController 的“空”子类 CustomizedViewController,它除了作为子类之外什么都不做 - 然后在整个代码中从那里继承子类,而不是从 UIViewController(基本上用“CustomizedViewController”替换所有出现的“UIViewController” - 除非 CustomizedViewController 实际上将 UIViewController 声明为其超类。

然后使用

[[UISegmentedControl appearanceWhenContainedIn:[CustomizedViewController class], nil] setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
于 2012-11-23T21:02:15.033 回答
2

好的,所以我终于能够找到解决方法。请参阅我对当前答案的评论,该评论解释了为什么该答案对我不起作用。

重申一下,据我所知,创建键盘附件的 iOS 代码是显式设置 UIToolbar 背景,因此您不会获得 UIAppearance 背景设置,但会获得 UIBarButtonItem 样式。结果是一个半样式的视图,看起来很糟糕。幸运的是,我的设计师对于这种特殊情况可以使用默认样式。

所以,真正的诀窍是弄清楚如何让该视图不通过 UIAppearance 设置样式。我这样做的方法是替换它:

id barButtonAppearanceProxy = [UIBarButtonItem appearance];

有了这个:

// wtf: Style any UIBarButtonItem associated with a UIViewController
id barButtonAppearanceProxy = [UIBarButtonItem appearanceWhenContainedIn:[UIViewController class], nil];

起初这对我来说似乎很奇怪,因为我正在考虑从视图层次结构的角度进行包容......但是,这只是说我们只会设置与 UIViewController 关联的 UIBarButtonItems 的样式。这不会影响键盘附件的原因是因为它直接添加了父视图的窗口,并且没有与 UIViewController 关联。

这仍然不是一个完美的解决方案,理想情况下我们只需使用 UIAppearance 设置键盘配件的样式。此外,它假定您的所有工具栏都与 UIViewController 相关联。对我(可能还有你们中的大多数人)来说幸运的是,通常情况就是这样。

于 2013-03-25T16:54:00.490 回答