Цвет текста в UIMenuController зависит от настройки внешнего вида UIButton

Я наблюдал следующее:

Установив Titlecolor для UIButton с внешним видом, UIMenuItems в UIMenuController из UITextView получают тот же цвет.

Код в applicationDidFinishLaunching:

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

Мой вопрос:

Есть ли способ подавить его
или
придать UIMenuItems другой цвет?

Что я пробовал:

  1. С помощью externalWhenContainedIn UITextview
    я попытался установить внешний вид кнопок, содержащихся в TextViews, с помощью
    [UIButton appearanceWhenContainedIn:[UITextView class], nil]
    Но это, очевидно, не сработало, поскольку UIMenuController не находится внутри TextView.

  2. С появлением WhenContainedIn UIMenuController/UIMenuItem
    это невозможно, так как оба не реализуют протокол UIAppearanceContainer.


person yinkou    schedule 20.10.2014    source источник
comment
См. также: stackoverflow.com/questions/5466570/   -  person JoePasq    schedule 18.11.2014
comment
У меня точно такая же проблема. Вы нашли решение?   -  person Tiago    schedule 27.05.2015
comment
Нет, я не мог это исправить. :/   -  person yinkou    schedule 28.05.2015


Ответы (1)


Я нашел 2 способа решить эту проблему.

Вот скриншот результата следующих решений:

введите описание изображения здесь

Первое решение

UIMenuController не содержится в иерархии представлений View Controller. Таким образом, вы можете определить свой цвет UIButton таким образом (вместо установки глобального внешнего вида кнопки):

Свифт:

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

Цель-C:

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

Это решение работает в большинстве случаев. Но если вы воспользуетесь кнопкой удаления или кнопкой действий в ячейках табличного представления, они также примут заданный цвет, и вы не сможете изменить этот цвет< /strong> через внешний прокси.

Второе решение (мое предпочтительное)

Во втором решении напрямую используется имя класса private UIButton, используемое Apple в контроллере меню. Я бы никогда не рекомендовал получать доступ к частному классу Apple (и, кроме того, через его имя), но в этом конкретном случае настройки цвета контроллера меню я думаю, что это лучшее решение. Это позволяет вам определить чистый способ отображения вашего представления.

Свифт:

Определите внешний вид цвета заголовка вашей глобальной кнопки:

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];
person Tanguy G.    schedule 25.02.2016
comment
UIButton.appearance().setTitleColor не кажется допустимым кодом - person Daniel Springer; 04.11.2019