Как удалить стиль выделения кнопки?

У меня есть кнопка с фоновым изображением. У меня серый цвет, когда я нажимаю на кнопку. Я хочу удалить этот серый цвет заливки изображения. Как это сделать?

пример:

код:

 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)
}

}

Что вы пытаетесь сделать с собственностью .selected? Предполагается ли, что это кнопка типа «переключатель» - когда нажатие на нее анимирует ее и меняет изображение?

DonMag 29.07.2024 19:02

@DonMag Я отредактировал вопрос и изменил анимацию gif. Проверьте, пожалуйста. В своем коде я никогда не использую значение isSelected. Я использую .normal и .selected только в строках setImage для изменения изображения кнопки. Моя кнопка — это простой переключатель включения/выключения звука. И я хочу показывать изображения включения/выключения. Но я также хочу удалить серый цвет заливки между изображениями переключения. Потому что у меня есть собственная анимация в классе кнопок.

user 30.07.2024 10:05

К вашему сведению... гораздо проще предложить помощь, если вопрос задан полностью. Если мы не можем скопировать/вставить/запустить опубликованный код (например, из-за отсутствия определений переменных), то нам придется сначала потратить дополнительное время, просто выясняя, что еще нужно, прежде чем мы сможем начать помогать.

DonMag 30.07.2024 14:39

@DonMag, я буду иметь это в виду

user 30.07.2024 16:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
4
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Чтобы отключить «серое» состояние, добавьте следующую строку:

// 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 30.07.2024 16:34

@user - это совсем другой вопрос, но... краткий пример см. в разделе «Редактирование моего ответа».

DonMag 31.07.2024 00:31

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

Похожие вопросы

Возникла проблема с фиксацией моего приложения на GitHub после обновления модулей
Приложение с мин. развертывание iOS16 аварийно завершает работу из-за SwiftData
App Store Connect не позволяет создавать новую версию приложения с запросом обновления лицензионного соглашения
Нижний лист iOS с фиксаторами дробей UIKit
`LongPressGesture` не регистрируется на iOS 18
Странная ошибка: «Невозможно сформировать ключевой путь к основному свойству, изолированному актером…» в параллелизме Swift
Есть ли способ установить идентификатор представления после перехода анимации?
Swift async/await реализует обновление с использованием задачи
Отклонение в App Store из-за рекомендации 5.1.2 — Проблемы с согласием AdMob и разрешениями на отслеживание в приложении Flutter
Передача аргумента неотправляемого типа '(любой URLSessionTaskDelegate)?' вне основного контекста, изолированного от актера, может возникнуть гонка данных