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

Programmierung für iOS
Guest
 Wie kann das Verhalten des Schaltflächenbilds abhängig von der Position des Fingers korrigiert werden?

Post by Guest »

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

}
Ergänzung:
Warum verwende ich ConfigurationHandler anstelle von setImage(UIImage?, for: UIControlState)? Wenn ich beim Klicken setImage verwende, wird das Bild mit einem grauen Hintergrund abgedeckt. Ich habe „adjustsImageWhenHighlighted = false“ verwendet, um das Problem zu lösen. Dies ist jedoch veraltet. Deshalb habe ich angefangen, die Konfiguration zu verwenden. Ich weiß, dass es mit dem Status „veraltet“ immer noch funktioniert. Aber ich habe Warnungen. Und ich wollte einen anderen Weg finden, das war die Konfiguration.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post