UIButton 外观还设置了键盘按钮
Posted
技术标签:
【中文标题】UIButton 外观还设置了键盘按钮【英文标题】:UIButton appearance also sets keyboard buttons 【发布时间】:2017-12-04 12:53:05 【问题描述】:当我试图清理一些代码时,我想使用视图的外观。但是UIButton
困扰着我。我尝试了以下方法:
[[UIButton appearanceWhenContainedInInstancesOfClasses:@[[UIViewController class]]] setBackgroundColor:[UIColor redColor]];
[[UIButton appearanceWhenContainedInInstancesOfClasses:@[[UIViewController class]]] setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
这符合预期,我所有的按钮都变成了红色和蓝色(在我的项目中我使用了其他颜色)。我注意到导航栏中的按钮也转动了,这是我宁愿没有的,所以添加这一行解决了第一个问题:
[[UIButton appearanceWhenContainedInInstancesOfClasses:@[[UINavigationBar class], [UIViewController class]]] setBackgroundColor:[UIColor clearColor]];
但这些并不是唯一的按钮。 iPad 上的键盘按钮(撤消、重做和粘贴)也有其他外观而不是默认的。有什么办法可以解决这个问题吗?此外,是否有一个我可以安全使用而不会“破坏”其他视图的外观列表(比如在这种情况下是键盘按钮)?我不是在谈论所有出现的列表,因为我发现了这个here。
我的想法是只选择我的UIViewController
(还包含导航栏)中的按钮,但显然键盘也是UIViewController
的子项。我希望有一种方法不需要在按钮周围添加自定义视图或包装器。
【问题讨论】:
【参考方案1】:将 MyBaseViewController 创建为 UIViewController 的子类,实现为空。将所有 viewController 更改为从 MyBaseViewController 继承。将您的调用更改为 AppearanceWhenContainedInInstancesOfClasses 方法以引用 MyBaseViewController。
您当前的代码将影响 UIViewController 的所有实例,包括那些嵌入在 Foundation 或 UIKit 中的实例。通过使用您自己的基类,您实际上是在创建一个过滤器,将您的视图控制器与其他视图控制器隔离开来。
【讨论】:
这实际上是我试图避免的事情,将我所有的 UIViewController 子类化,因为这是我目前所拥有的。再说一次,这个解决方案比我的实际实现更漂亮,因为超类(BrandedViewController)实际上有标记所有元素的方法,而这仍然使用外观,所以没有循环。另外无需在 UINavigationController 中重置 UIButton。但是实际 UIViewController 中的所有元素是否没有任何其他“选择器”。以上是关于UIButton 外观还设置了键盘按钮的主要内容,如果未能解决你的问题,请参考以下文章
使用imageView外观禁用UIButton而不将isEnabled设置为false
如何将 UIButton 设置为 Touch ID 或 Face ID 图像