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)
}
}
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]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)
}
}
[/code]
Schaltflächenklasse
[code]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)
}
}
[/code]