iOS - 防止UIAppearance设置改变UIWebView输入附件视图

7
在我的应用程序中有一个UIWebView,问题在于我有一个UIAppearance,它修改了分段控件的外观,所以它修改了UIWebView文本字段输入附件视图中的分段控件,我希望它看起来正常,或者不要尝试修改它。这是当前的样子:

我也遇到了同样的问题,这让我感到非常烦恼。 - Jarsen
似乎不是UISegmentedControl的外观设置,而是UIToolbar的外观设置,我不太确定,但似乎无法在不删除我的外观设置的情况下解决它。另外,似乎没有简单且安全的方法可以从UIWebView中删除工具栏。 - 8vius
是的,看起来问题在于它正在改变分段控制器未选定区域的 alpha 值。我想知道这是否与 UIToolbar 本身具有透明度有关。 - Jarsen
所以我和我的本地Cocoaheads小组交流了一下,得到了一些想法。其中一个人在博客上写了一篇关于如何移除附加视图的文章http://bjhomer.blogspot.com/2012/03/how-to-hide-inputaccessoryview-of.html,其他人则建议使用appearanceWhenContainedIn:方法。 - Jarsen
我已经搜索了那个解决方案,API 中似乎没有那个选项,inputAccessoryView 本身似乎没有任何类。 - 8vius
显示剩余3条评论
2个回答

5
我刚刚通过使用[UIAppearance appearanceWhenContainedIn:]而不是[UIAppearance appearance]成功解决了这个问题。
您可以向该选择器发送一个以nil结尾的列表,其中包含所有自定义视图控制器类别,这些类别包含您想要自定义的元素。因此,不要使用:
[[UISegmentedControl appearance] setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

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

您不需要列出所有的ViewController,只需列出顶级的即可。这也使得下面的技巧成为可能:创建一个'空的'UIViewController子类CustomizedViewController,除了作为一个子类外不做任何其他事情 - 然后从中派生你的代码而不是从UIViewController中派生(基本上用'CustomizedViewController'替换所有出现的'UIViewController',除非CustomizedViewController实际声明UIViewController为其超类)。

然后使用

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

我已经失去了对这个问题得到解答的信心,我稍后再试一次,Stefan。谢谢。 - 8vius
2
很遗憾,我正在处理的项目有数百个类分布在多个团队中,使用我无法控制的代码。UIAppearance 的优美之处在于(理论上),我不必麻烦地处理我想要修改样式的类。我不能逐个处理我想要修改的每个类并给它们一个共同的超类,只是为了让 UIAppearance 能够工作。也许如果苹果公司能够包含一个 appearanceWhenNotContainedIn 方法,我至少可以抑制 UIWebView 中 UIToolbar 的样式... - tyler
对我来说它不起作用... 当我使用Web视图呈现视图控制器时,工具栏具有默认外观,但键盘工具栏已自定义。 - HotJard

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相关联。幸运的是,对我(和大多数人)来说,这通常是成立的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接