У меня есть кнопка с фоновым изображением. У меня серый цвет, когда я нажимаю на кнопку. Я хочу удалить этот серый цвет заливки изображения. Как это сделать?
пример:
код:
barButton = SLButtonWithImage(type: .custom)
barButton.configuration = .none
barButton.tag = index
barButton.imageView?.tintAdjustmentMode = .normal
barButton.translatesAutoresizingMaskIntoConstraints = false
barButton.layer.shadowColor = UIColor.black.withAlphaComponent(0.5).cgColor
barButton.layer.shadowOffset = CGSize.zero
barButton.layer.shadowOpacity = 0.2
barButton.layer.shadowRadius = 3
barButton.setImage(UIImage(named: rightButtonsImagesArrayNormal[index-1]), for: .normal)
barButton.setImage(UIImage(named: rightButtonsImagesArrayHighlighted[index-1]), for: .selected)
barButton.addTarget(self, action: #selector(self.rightbuttonAction), for: .touchDown)
Код SLButtonWithImage:
class SLButtonWithImage: UIButton {
override var isHighlighted: Bool {
didSet {
if oldValue == false && isHighlighted {
highlight()
} else if oldValue == true && !isHighlighted {
unhighlight()
}
}
}
func setup(highlightScale: CGFloat, highlightDuration: TimeInterval, unhighlightDuration: TimeInterval) {
buttonHighlightedScale = highlightScale
buttonHighlightDuration = highlightDuration
}
func highlight() {
animateScale(to: buttonHighlightedScale, duration: buttonScaleDownDuration)
}
func unhighlight() {
animateScale(to: 1, duration: buttonScaleUpDuration)
isSelected.toggle()
}
private func animateScale(to scale: CGFloat, duration: TimeInterval) {
UIView.animate( withDuration: duration, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: [], animations: {
self.transform = .init(scaleX: scale, y: scale)
}, completion: nil)
}
}
@DonMag Я отредактировал вопрос и изменил анимацию gif. Проверьте, пожалуйста. В своем коде я никогда не использую значение isSelected. Я использую .normal и .selected только в строках setImage для изменения изображения кнопки. Моя кнопка — это простой переключатель включения/выключения звука. И я хочу показывать изображения включения/выключения. Но я также хочу удалить серый цвет заливки между изображениями переключения. Потому что у меня есть собственная анимация в классе кнопок.
К вашему сведению... гораздо проще предложить помощь, если вопрос задан полностью. Если мы не можем скопировать/вставить/запустить опубликованный код (например, из-за отсутствия определений переменных), то нам придется сначала потратить дополнительное время, просто выясняя, что еще нужно, прежде чем мы сможем начать помогать.
@DonMag, я буду иметь это в виду
Чтобы отключить «серое» состояние, добавьте следующую строку:
// disable the image adjustment when button is highlighted
barButton.adjustsImageWhenHighlighted = false
Вы получите это предупреждение:
adjustsImageWhenHighlighted was deprecated in iOS 15.0: This property is ignored when using UIButtonConfiguration, you may customize to replicate this behavior via a configurationUpdateHandler
Однако обратите внимание: вы не используете UIButtonConfiguration
Редактировать
Один подход, используя UIButtonConfiguration
...
Используя эти два изображения размером 60x55:
Их трудно увидеть, поскольку они в основном белые с четким фоном. Вот так они выглядят на желтом фоне:
Мы будем использовать целевое действие .touchUpInside
для переключения состояния «динамик включен/выключен», а UIButton.ConfigurationUpdateHandler
— для управления изображением кнопки.
Пример кода:
class ViewController: UIViewController {
var speakerButton: UIButton!
var isSpeakerOn: Bool = true
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemYellow
guard let imgOn = UIImage(named: "speaker_on60x55"),
let imgOff = UIImage(named: "speaker_off60x55")
else {
fatalError("Could not load button images!")
}
var cfg = UIButton.Configuration.plain()
cfg.image = imgOn
speakerButton = UIButton(configuration: cfg)
let handler: UIButton.ConfigurationUpdateHandler = { [weak self] button in
guard let self = self else { return }
var updatedConfiguration = button.configuration
let isHighlighted = button.isHighlighted
button.transform = isHighlighted ? .init(scaleX: 1.25, y: 1.25) : .identity
// Change the image based on the isSpeakerOn state
updatedConfiguration?.image = self.isSpeakerOn ? imgOn : imgOff
// Apply the updated configuration
button.configuration = updatedConfiguration
}
speakerButton.configurationUpdateHandler = handler
speakerButton.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(speakerButton)
let g = view.safeAreaLayoutGuide
NSLayoutConstraint.activate([
speakerButton.topAnchor.constraint(equalTo: g.topAnchor, constant: 20.0),
speakerButton.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 20.0),
speakerButton.widthAnchor.constraint(equalToConstant: 60.0),
speakerButton.heightAnchor.constraint(equalToConstant: 55.0),
])
speakerButton.addTarget(self, action: #selector(speakerBtnTap(_:)), for: .touchUpInside)
}
@objc func speakerBtnTap(_ sender: Any?) {
self.isSpeakerOn.toggle()
speakerButton.setNeedsUpdateConfiguration()
}
}
Спасибо. Это отличная работа. Но что мне делать, если мне нужно использовать UIButtonConfiguration
?
@user - это совсем другой вопрос, но... краткий пример см. в разделе «Редактирование моего ответа».
Что вы пытаетесь сделать с собственностью
.selected
? Предполагается ли, что это кнопка типа «переключатель» - когда нажатие на нее анимирует ее и меняет изображение?