Как отключить изменение цвета заголовка, когда выделенное состояние для UIButton с помощью UIButtonConfiguration активно?

Вот как определяется и инициализируется мой UIButton:

lazy var addButton: UIButton = {
    let button = UIButton(radius: 32, title: "+", font: .poppinsRegular.withSize(40), backgroundColor: .purple)
    button.menu = UIMenu(title: "")
    button.showsMenuAsPrimaryAction = true
    return button
}()


extension UIButton {
    convenience init(
        radius: CGFloat = 0,
        title: String? = nil,
        backgroundColor: UIColor? = nil,
        foregroundColor: UIColor = .white,
        font: UIFont? = nil
    ) {
        var configuration = UIButton.Configuration.filled()
        configuration.baseForegroundColor = foregroundColor
        configuration.title = title
        configuration.background.cornerRadius = radius
        configuration.cornerStyle = .fixed
        configuration.contentInsets = .zero
        configuration.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { incoming in
            var outgoing = incoming
            outgoing.font = font
            return outgoing
        }
        configuration.baseBackgroundColor = backgroundColor
        configuration.background.backgroundColor = backgroundColor
        self.init(configuration: configuration)
    }
}

Что изменить, чтобы заголовок оставался полностью белым, даже если он выделен?

UIButtonConfiguration — плохо документированная вещь. Вам нужен другой шаблон. Может быть plain вместо filled. Возможно, эта статья поможет: augmentedcode.io/2021/10/25/…

Cy-4AH 28.06.2024 10:08

@BartłomiejSemańczyk - согласно вашему комментарию, я удалил свой ответ. Обратите также внимание на Edit, который, по моему мнению, является похожим, но лучшим подходом.

DonMag 02.07.2024 18:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
92
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Попробуйте это...

В вашем .titleTextAttributesTransformer:

    configuration.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { incoming in
        var outgoing = incoming
        outgoing.font = font
        
        // add this line
        outgoing.foregroundColor = foregroundColor
        
        return outgoing
    }

и добавьте ConfigurationUpdateHandler:

let handler: UIButton.ConfigurationUpdateHandler = { button in
    var background = UIButton.Configuration.plain().background
    background.cornerRadius = 32
    background.backgroundColor = .purple
    button.configuration?.background = background
}
    
addButton.configurationUpdateHandler = handler
    

Редактировать

Другой (я думаю, лучший) подход...

Внедрите .backgroundColorTransformer в свой удобный инициализатор:

extension UIButton {
    convenience init(
        radius: CGFloat = 0,
        title: String? = nil,
        backgroundColor: UIColor? = nil,
        foregroundColor: UIColor = .white,
        font: UIFont? = nil
    ) {
        // use plain instead of filled
        var configuration = UIButton.Configuration.plain()
        configuration.baseForegroundColor = foregroundColor
        configuration.title = title
        configuration.background.cornerRadius = radius
        configuration.cornerStyle = .fixed
        configuration.contentInsets = .zero

        configuration.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { incoming in
            var outgoing = incoming
            outgoing.font = font
            
            // add this line
            outgoing.foregroundColor = foregroundColor
            
            return outgoing
        }

        configuration.background.backgroundColor = backgroundColor
        
        // prevent default background color/tint change
        configuration.background.backgroundColorTransformer = UIConfigurationColorTransformer { _ in
            return backgroundColor!
        }

        self.init(configuration: configuration)
    }
}

Теперь нам больше не нужно назначать ConfigurationUpdateHandler.

Я считаю, что игрушке нужно установить изображение, используя

setBackgroundImage(_ image: UIImage?, for state: UIControl.State)

и установите его как для состояний .normal, так и для .highlighted/.selected, чтобы он не использовал реализацию по умолчанию.

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