Какой объект UIKit управляет появлением всплывающего окна «Искать»? - PullRequest
0 голосов
/ 11 ноября 2018

В нашем приложении у нас есть светлый режим и темный режим, которые переключают цвета текста и фона. Theme - это enum с чехлами light и dark. У нас есть методы для переключения цветов, такие как:

var textColor: UIColor {
    switch self {
    case .light:
        return UIColor(red:60/255.0, green:60/255.0, blue:60/255.0, alpha: 1.0)
    case .dark:
        return UIColor(red: 240.0/255.0, green: 248.0/255.0, blue: 255.0/255.0, alpha: 1.0)
    }
}

И у нас есть метод apply, который применяет тему ко всем представлениям, которые мы используем в нашем приложении:

func apply(){
    defaults.set(rawValue, forKey: "selectedTheme")

    UIApplication.shared.delegate?.window??.tintColor = tintColor

    let navBarAppearance = UINavigationBar.appearance()
    navBarAppearance.barStyle = barStyle
    navBarAppearance.backgroundColor = backgroundColor
    navBarAppearance.barTintColor = backgroundColor
    navBarAppearance.tintColor = tintColor
    navBarAppearance.isTranslucent = false
    navBarAppearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor: textColor] 
    let tabBarAppearance = UITabBar.appearance()
    tabBarAppearance.barStyle = barStyle
    tabBarAppearance.backgroundColor = backgroundColor
    tabBarAppearance.barTintColor = backgroundColor

    let toolBar = UIToolbar.appearance()
    toolBar.backgroundColor = backgroundColor
    toolBar.tintColor = backgroundColor
    toolBar.barStyle = barStyle
    toolBar.isTranslucent = false
    toolBar.barTintColor = backgroundColor

    UITableViewCell.appearance().backgroundColor = backgroundColor
    UILabel.appearance(whenContainedInInstancesOf: [UITableViewCell.self]).textColor = textColor
    UILabel.appearance().textColor = textColor

    UITextField.appearance().keyboardAppearance = keyboardColor
    UITextField.appearance().textColor = textColor
    UITextField.appearance().backgroundColor = backgroundColor

    UITextView.appearance().textColor = textColor
    UITextView.appearance().backgroundColor = backgroundColor

    MultiSelectSegmentedControl.appearance().tintColor = tintColor
    MultiSelectSegmentedControl.appearance().backgroundColor = backgroundColor

    UISegmentedControl.appearance().tintColor = tintColor
    UISegmentedControl.appearance().backgroundColor = backgroundColor

    UIButton.appearance().tintColor = tintColor

    BigButton.appearance().backgroundColor = Theme.current.tintColor
    BigButton.appearance().tintColor = Theme.current.backgroundColor

    UIPickerView.appearance().backgroundColor = Theme.current.backgroundColor
    UIPickerView.appearance().tintColor = Theme.current.tintColor

    UITableView.appearance().backgroundColor = backgroundColor
    UITableView.appearance().separatorColor = cellSelectionColor

    UISearchBar.appearance().backgroundColor = backgroundColor
    UISearchBar.appearance().barTintColor = tintColor
    UISearchBar.appearance().searchBarStyle = .minimal
    UITextView.appearance().backgroundColor = backgroundColor
    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = textColor

    UISwitch.appearance().onTintColor = tintColor

    let colorView = UIView()
    colorView.backgroundColor = cellSelectionColor

    UITableViewCell.appearance().selectedBackgroundView = colorView
}

Когда кто-то выбирает текст в нашем приложении и нажимает кнопку «поиск» в пункте всплывающего меню, всплывающее окно выглядит правильно. Однако, когда вы щелкаете мышью по некоторым представлениям (например, по словарю и знаниям сири), фон или цвета текста, похоже, изменились. Пример:

Darkened Text

Как мы можем контролировать цвет текста в этом всплывающем окне?

РЕДАКТИРОВАТЬ: цель состоит в том, чтобы найти имя объекта пользовательского интерфейса, который создается при нажатии UIMenuItems. Его нет ни в Инспекторе отладчика XCode, ни в self.view.subviews. Кажется, это какой-то встроенный объект, который скрыт от остальных процессов.

1 Ответ

0 голосов
/ 14 ноября 2018

Может быть одна или две возможные проблемы

1) Вы должны убедиться, что вы не устанавливаете textColor для меток и backgroundColor для view явно в коде. Label color следует сохранить default, чтобы он мог использовать appearance color. Например, допустим, мы установили textColor по умолчанию, как показано на рисунке ниже,

enter image description here

Теперь, если мы применим textColor к 1022 *, выполнив UILabel.appearance().textColor = .green. Он изменит color на green, как только вы откроете всплывающее окно.

Но если вы устанавливаете textColor явно после установки внешнего вида, как показано ниже,

UILabel.appearance().textColor = .green
copyrightLabel.textColor = .yellow

, тогда он отменит настройку appearance и установит color (т.е. .yellow), который вы указали позже.

2) Другой возможной проблемой может быть создание этого всплывающего окна перед изменением внешнего вида. Я имею в виду, что если вы создали экземпляр этого всплывающего окна в то время, когда внешний вид был light, поэтому, если вы измените внешний вид сейчас на dark, он не будет автоматически обновлять цвета всплывающего окна до dark, поскольку он уже создан. Если это так, то вам, возможно, придется сделать reloadData на tableView/collectionView и обновить все остальные цвета представления самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...