受UIButton外观设置影响的UIMenuController中的文本颜色

yin*_*kou 9 uibutton uimenucontroller uiappearance

我观察到以下情况:

通过设置具有外观的a 的Titlecolor,a 中的a 得到相同的颜色.UIButtonUIMenuItemsUIMenuControllerUITextView

代码applicationDidFinishLaunching:

[[UIButton appearance] setTitleColor:[UIColor greenColor] forState:UIControlStateNormal];  
Run Code Online (Sandbox Code Playgroud)

我的问题:

有没有办法抑制它

UIMenuItems另一种颜色?

我尝试过的:

  1. withWhenContainedIn UITextview
    我试图设置TextViews中包含的按钮的外观
    [UIButton appearanceWhenContainedIn:[UITextView class], nil]
    但是这显然不起作用,因为UIMenuController它不在TextView中.

  2. 使用appearanceWhenContainedIn UIMenuController/UIMenuItem
    是不可能的,因为两者都没有实现UIAppearanceContainer协议.

Tan*_* G. 5

我找到了两种方法来解决这个问题.

以下是以下解决方案的结果屏幕截图:

在此输入图像描述

第一解决方案

UIMenuController未包含在View Controller视图层次结构中.因此,您可以通过这种方式定义UIButton颜色(而不是设置全局Button 外观):

斯威夫特:

UIButton.appearanceWhenContainedInInstancesOfClasses([UIViewController.self]).setTitleColor(UIColor.redColor(), forState: UIControlState.Normal)
Run Code Online (Sandbox Code Playgroud)

Objective-C:

[[UIButton appearanceWhenContainedInInstancesOfClasses:@[UIViewController.class]] setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)

该解决方案适用于大多数情况.但是,如果您使用表视图单元格删除按钮或操作按钮,它也将采用设置颜色,您将无法通过外观代理更改该颜色.

第二种解决方案(我的首选)

第二个解决方案直接使用Apple在菜单控制器中使用的私有UIButton子类类名.我永远不会建议访问私有Apple类(以及通过其名称),但在特定的菜单控制器颜色定制案例中,我认为这是最好的解决方案.它允许您定义视图外观的干净方式.

斯威夫特:

定义全局Button标题颜色外观:

UIButton.appearance().setTitleColor(UIColor.redColor(), forState: UIControlState.Normal)
Run Code Online (Sandbox Code Playgroud)

MenuController的特殊例外:

(NSClassFromString("UICalloutBarButton")! as! UIButton.Type).appearance().setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
Run Code Online (Sandbox Code Playgroud)

Objective-C:

定义全局Button标题颜色外观:

[[UIButton appearance] setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)

MenuController的特殊例外:

[[NSClassFromString(@"UICalloutBarButton") appearance] setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)