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

时间:2014-10-20 09:05:54

标签: uibutton uiappearance uimenucontroller

我观察到以下情况:

通过设置具有外观的UIButton Titlecolor UIMenuItems UIMenuController中的UITextView获得相同的颜色。

applicationDidFinishLaunching中的代码:

[[UIButton appearance] setTitleColor:[UIColor greenColor] forState:UIControlStateNormal];  

我的问题:

有没有办法压制它
给另一种颜色UIMenuItems

我尝试过:

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

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

1 个答案:

答案 0 :(得分:5)

我找到了两种解决此问题的方法。

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

enter image description here

第一个解决方案

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

斯威夫特:

UIButton.appearanceWhenContainedInInstancesOfClasses([UIViewController.self]).setTitleColor(UIColor.redColor(), forState: UIControlState.Normal)

目标C:

[[UIButton appearanceWhenContainedInInstancesOfClasses:@[UIViewController.class]] setTitleColor:[UIColor redColor] forState:UIControlStateNormal];

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

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

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

斯威夫特:

定义全局按钮标题颜色外观:

UIButton.appearance().setTitleColor(UIColor.redColor(), forState: UIControlState.Normal)

MenuController的特殊例外:

(NSClassFromString("UICalloutBarButton")! as! UIButton.Type).appearance().setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)

目标C:

定义全局按钮标题颜色外观:

[[UIButton appearance] setTitleColor:[UIColor redColor] forState:UIControlStateNormal];

MenuController的特定异常:

[[NSClassFromString(@"UICalloutBarButton") appearance] setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];