iOS - Запретить настройкам UIAppearance изменять вид аксессуара ввода UIWebView

У меня есть UIWebView в моем приложении, и проблема в том, что у меня есть UIAppearance, которое изменяет внешний вид сегментированных элементов управления, поэтому он изменяет сегментированный элемент управления в представлении вспомогательного ввода для текстовых полей UIWebView, я хотел бы, чтобы он выглядел правильно, или не пытаться изменить его. Вот как это выглядит в настоящее время:

2 ответа

Решение

Я просто решил эту проблему для себя, используя [UIAppearance AppearanceWhenContainedIn:] вместо [UIAppearance внешний вид].

Используйте его, отправив селектору завершенный нулем список всех ваших пользовательских классов ViewController, которые содержат элементы, которые вы хотите настроить. Так что вместо

[[UISegmentedControl appearance] setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

использование

[[UISegmentedControl appearanceWhenContainedIn:[MyViewController class], [MyOtherViewController class], nil] setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

Вам не нужно перечислять все контроллеры ViewController, только ваши высокоуровневые. Это также делает возможным следующий трюк: создание "пустого" подкласса CustomizedViewController из UIViewController, который не делает ничего, кроме как подкласс, - а затем подкласс оттуда по всему коду вместо UIViewController (по сути, замените все вхождения "UIViewController" на "CustomizedViewController" - кроме случаев, когда CustomizedViewController фактически объявил UIViewController в качестве своего суперкласса.

Тогда используйте

[[UISegmentedControl appearanceWhenContainedIn:[CustomizedViewController class], nil] setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

Итак, я наконец-то смог найти способ обойти это. Смотрите мой комментарий к текущему ответу, который объясняет, почему этот ответ не работает для меня.

Повторяю, из того, что я могу сказать, код iOS, который создает аксессуар для клавиатуры, явно устанавливает фон UIToolbar, поэтому вы не получите настройки фона UIAppearance, но вы получите стиль UIBarButtonItem. В результате получился полу-стилизованный вид, который может выглядеть довольно плохо. К счастью, мой дизайнер прекрасно справился со стилем по умолчанию для этого конкретного случая.

Итак, хитрость заключалась в том, чтобы выяснить, как сделать так, чтобы это представление НЕ стилизовалось через UIAppearance. Способ, которым я сделал это, должен был заменить это:

id barButtonAppearanceProxy = [UIBarButtonItem appearance];

С этим:

// wtf: Style any UIBarButtonItem associated with a UIViewController
id barButtonAppearanceProxy = [UIBarButtonItem appearanceWhenContainedIn:[UIViewController class], nil];

Поначалу мне это показалось странным, потому что я думал о сдерживании с точки зрения иерархии представлений... Но это просто говорит о том, что мы будем стилизовать только UIBarButtonItems, которые связаны с UIViewController. Причина, по которой это не влияет на вспомогательное оборудование клавиатуры, заключается в том, что он добавляется непосредственно в окно родительского представления и не связан с UIViewController.

Это все еще не идеальное решение, так как в идеале мы бы просто придавали аксессуару для клавиатуры стиль UIAppearance. Также предполагается, что все ваши панели инструментов связаны с UIViewControllers. К счастью для меня (и, вероятно, для большинства из вас), это обычно так.

Другие вопросы по тегам