In Ordnung, ich habe How to trigger tap gesture recognizer of UIView programmatically und ähnliche Fragen angeschaut, kann aber nicht finden, wonach ich suche. Ich erstelle eine iMessage App-Erweiterung und muss programmgesteuert ein Tippereignis auf einem MSSticker auslösen.Trigger auf MSSticker tippen oder programmgesteuert anzeigen?
Ich habe benutzerdefinierte MSStickerViews mit der folgenden Klasse gemacht, die erkennt, wenn es gedrückt und/oder getappt wurde, löst dann eine andere Funktion aus, aber ich weiß nicht, wie man diese Taps tatsächlich SIMULIERT, so dass der Aufkleber in die gelegt wird Eingabefeld:
protocol InstrumentedStickerViewDelegate: class {
func stickerViewDidSelect(stickerView: MSStickerView)
func stickerViewDidPeel(stickerView: MSStickerView)
}
class InstrumentedStickerView: MSStickerView {
weak var delegate: InstrumentedStickerViewDelegate?
override init(frame: CGRect) {
super.init(frame: frame)
for gestureRecognizer in gestureRecognizers ?? [] {
if let tapGestureRecognizer = gestureRecognizer as? UITapGestureRecognizer {
tapGestureRecognizer.addTarget(self, action: #selector(didTap))
} else if let longPressGestureRecognizer = gestureRecognizer as? UILongPressGestureRecognizer {
longPressGestureRecognizer.addTarget(self, action: #selector(didLongPress))
}
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func didTap(tapGestureRecognizer: UITapGestureRecognizer) {
if tapGestureRecognizer.state == .recognized {
delegate?.stickerViewDidSelect(stickerView: self)
}
}
func didLongPress(longPressGestureRecognizer: UILongPressGestureRecognizer) {
if longPressGestureRecognizer.state == .began {
delegate?.stickerViewDidPeel(stickerView: self)
}
}
}
der Grund, warum gerade über eines der Hahn Funktionen aufrufen wird nicht funktionieren wird, ich brauche keine bestimmte Funktion mit dem Hahn auszulösen - ich muss nur auf die eine gefälschte Hahn erstellen MSSticker innerhalb der MSStickerView, so dass es in das Eingabefeld gelegt wird. Ich habe keine Ahnung, wie ich das machen soll.
Ich eröffne mein MSStickerViews wie diese und sie in einer Sammlung Ansicht setzen, aber die Sammlung Sichtzelle programmatisch Klopfen tut nichts (Ive versuchte):
var url: URL?
var i = 1
while i < 5 { //while true
url = Bundle.main.url(forResource: "test5", withExtension: "png") //would be "test\(i)"
print("URL IS THIS: \(url)")
guard let url = url else { break }
//make it a sticker
let sticker = try! MSSticker(contentsOfFileURL: url, localizedDescription: "test\(i)")
//let stickerView = InstrumentedStickerView(frame: CGRect(x: 0, y: 0, width: view.bounds.width*0.4, height: view.bounds.width*0.4))
let stickerView = InstrumentedStickerView(frame: CGRect(origin: CGPoint(x: 0,y :0), size: stickerSize))
stickerView.sticker = sticker
stickerView.delegate = self
starterPack.append(stickerView)
i += 1
Ich habe das Gefühl, vielleicht so etwas wie (Pseudo-Code)
starterPack[1].sendActionForEvent(UIEvent.Tap)
ist richtig, aber die MSStickerView hat nicht .sendActionForEvent
ich bin verzweifelt. Wie kann ich einen falschen Tipp erstellen?
ich arbeitete auch in dieser Frage, aber habe Lösung nicht, wenn Sie diese Funktionalität erreichen mögen Sie Bildansicht statt stickerview verwenden und jede Aktion durchführen, die Sie in Ihrer Kollektion Zelle Delegatmethode didselect wollen . –