我的应用程序中有一个UIWebView,问题是我有一个UIAppearance修改了分段控件的外观,所以它在UIWebView文本字段的输入附件视图中修改了分段控件,我想它正确看,或不试图修改它。这就是目前的情况:
答案 0 :(得分:5)
我刚用[UIAppearance appearanceWhenContainedIn:]而不是[UIAppearance appearance]来解决这个问题。
通过向选择器发送包含您要自定义的元素的所有自定义ViewController类的nil-terminated列表来使用它。而不是
[[UISegmentedControl appearance] setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
使用
[[UISegmentedControl appearanceWhenContainedIn:[MyViewController class], [MyOtherViewController class], nil] setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
您不需要列出所有ViewControllers,只需列出您的顶级ViewControllers。这也使得以下技巧成为可能:创建UIViewController的'empty'子类CustomizedViewController,除了作为子类之外什么也不做 - 然后从你的代码中继承子类而不是UIViewController(基本上用'CustomizedViewController'替换'UIViewController'的所有出现' - 除非CustomizedViewController实际上将UIViewController声明为其超类。
然后使用
[[UISegmentedControl appearanceWhenContainedIn:[CustomizedViewController class], nil] setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
答案 1 :(得分: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设计键盘配件。此外,它假定您的所有工具栏都与UIViewControllers相关联。幸运的是,我(也可能是大多数人)通常就是这种情况。