2016-12-07 5 views
0

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?

+0

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 . –

Antwort

0

Sie müssen eine MSMessage erstellen, die Sie als insert zu Ihrem aktuellen MSConversation.

conversation.insert(message) { error in 
    // handle error 
} 

Siehe Apples sample code.

+0

Wird die Nachricht automatisch gesendet? Ich möchte es nicht unbedingt senden, einfach in den Text ENTRY Feld, wie wo Menschen Textnachrichten – skyguy

+0

Entwurf nicht senden, sondern einfügen. Überprüfen Sie den Beispielcode. – shallowThought

+0

Ich habe ein paar Probleme, nur einen Aufkleber allein einfügen. Hast du das schon einmal gemacht? Würdest du dir meine letzte Frage anschauen? Http://stackoverflow.com/questions/41070206/problems-with-structs-in-swift-and-making-a-uiimage-from-url – skyguy

-1

Um zu verdeutlichen, haben Sie eine UICollectionView, wo Sie eine Reihe von UICollectionViewCells anzeigen, von denen jede eine MSStickerView haben. Ich gehe voran, vorausgesetzt, das ist richtig.

Sie sind objektiv, wenn ein Benutzer auf eine dieser Sammelansichtszellen klickt, fügen Sie den Aufkleber in das Meldungsfeld ein, so dass, wenn der Benutzer auf die Senden-Schaltfläche klickt, der Aufkleber gesendet wird, richtig?

In diesem Szenario würde ich einen Verweis auf den MSSticker in Ihrer UICollectionViewCell-Unterklasse pflegen (vorausgesetzt, Sie haben eine Unterklasse. Wenn nicht, schlage ich vor, eine für Ihre Zwecke zu erstellen). Wenn ein Benutzer dann auf eine Zelle tippt und Ihre didSelectCellAt-Methode aufgerufen wird, können Sie den MSSticker aus dieser Zelle entnehmen und in Ihre Nachricht einfügen.

Hoffnung, der Sinn macht

+0

Sticker Block didSelectCellAt Methode, haben Sie @Jeff ausprobiert? –

Verwandte Themen