Вот как определяется и инициализируется мой 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)
}
}
Что изменить, чтобы заголовок оставался полностью белым, даже если он выделен?
@BartłomiejSemańczyk - согласно вашему комментарию, я удалил свой ответ. Обратите также внимание на Edit, который, по моему мнению, является похожим, но лучшим подходом.





Попробуйте это...
В вашем .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, чтобы он не использовал реализацию по умолчанию.
UIButtonConfiguration — плохо документированная вещь. Вам нужен другой шаблон. Может быть
plainвместоfilled. Возможно, эта статья поможет: augmentedcode.io/2021/10/25/…