Wie kann das Verhalten des Schaltflächenbilds abhängig von der Position des Fingers korrigiert werden?

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Wie kann das Verhalten des Schaltflächenbilds abhängig von der Position des Fingers korrigiert werden?

by Guest » 15 Jan 2025, 17:42

Ich habe eine Schaltfläche und eine Aktion. Ich habe auch ein Bild für den Knopf im Normalzustand und wenn er gedrückt wird. Dies sind .svg-Bilder. Meine Taste dient zum Stummschalten/Aufheben der Stummschaltung des Tons. Ich habe also zwei Bilder mit dem Sprecher und mit dem durchgestrichenen Sprecher. Und wenn ich auf den Button klicke, dann sollte sich das Bild ändern. Alles funktioniert gut. Beim Drücken ändert sich das Bild und die Aktion funktioniert normal. Das Problem ist jedoch, dass sich mein Bild in einen durchgestrichenen Lautsprecher verwandelt, wenn ich die Taste drücke, aber meinen Finger nicht vom Bildschirm entferne, sondern ihn außerhalb des Tastenbereichs bewege, und wenn ich dann meinen Finger vom Bildschirm entferne außerhalb des Tastenbereichs, dann erhalte ich am Ende, dass sich das Bild in einen durchgestrichenen Lautsprecher ändert, die Aktion jedoch nicht ausgeführt wird und der Ton weiterhin abgespielt wird. Wenn ich meinen Finger aus dem Tastenbereich heraus und dann zurück in diesen Bereich bewege, ändert sich das Bild. Wie kann man das beheben?
Controller-Klasse

Code: Select all

class ViewController: UIViewController {
var button: SomeButtonWithImage = {
let button = SomeButtonWithImage()
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()

override func viewDidLoad() {
super.viewDidLoad()

button = SomeButtonWithImage()
button.normalImage = "mute"
button.selectedImage = "unmute"
button.tag = index
button.widthAnchor.constraint(equalToConstant: controlButtonsHeight).isActive = true
button.heightAnchor.constraint(equalToConstant: controlButtonsHeight).isActive = true
button.addTarget(self, action: #selector(self.rightButtonAction), for: .touchUpInside)
rightStackView.addArrangedSubview(button)
}
}
Schaltflächenklasse

Code: Select all

class SomeButtonWithImage: UIButton {

var buttonSelectedScale: CGFloat = 0.9
var buttonScaleDownDuration: TimeInterval = 0.15
var buttonScaleUpDuration: TimeInterval = 0.25
public var normalImage: String = ""
public var selectedImage: String = ""

override var isHighlighted: Bool {
didSet { if oldValue == false && isHighlighted { selected() }
else if oldValue == true && !isHighlighted { deselected() }
}
}

override init(frame: CGRect) {
super.init(frame: frame)
configuration = .plain()
configuration?.baseBackgroundColor = .clear
configurationUpdateHandler = { button in
switch button.state {
case .normal: button.configuration?.image = UIImage(named: self.normalImage)
case .selected: button.configuration?.image = UIImage(named: self.selectedImage)
default: break
}
}
}

required init?(coder: NSCoder) { fatalError("error") }

func selected() { animateScale(to: buttonSelectedScale, duration: buttonScaleDownDuration) }
func deselected() { 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)
}

}

Top