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 外观还设置了键盘按钮的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 动作

使用imageView外观禁用UIButton而不将isEnabled设置为false

如何创建具有清晰背景的按钮

如何将 UIButton 设置为 Touch ID 或 Face ID 图像

UITableViewCell 显示指示器继承 UIButton 的外观

The Swift Code之设置UIButton的不同方式创建,以及不同的状态和外观