2016-12-07 3 views
0

申し訳ありませんが、私はHow to trigger tap gesture recognizer of UIView programmaticallyと類似の質問を見ましたが、私が探しているものを見つけることができません。私はiMessageアプリの拡張機能を構築しており、プログラムでもMSStickerのタップイベントをトリガする必要があります。トリガはMSStickerをタップするか、またはプログラムで表示できますか?

私はカスタムMSStickerViewsを次のクラスで作成しました。このクラスは、押されたときやタップされたときに検出され、別の関数をトリガーしますが、実際にこれらのタップをシミュレートしてステッカーを入力フィールド:

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

ちょうど私はタップするだけで任意の特定の機能を起動する必要はありませんされて動作しません上記のタップ機能のいずれかを呼び出した理由 - 私はちょうど上の偽のタップを作成する必要がありますMSStickerView内のMSStickerが入力フィールドに配置されます。私はこれをどうやって行うのか分かりません。

私は(アイブ氏は試してみました)このように私のMSStickerViewsを作成し、コレクションビューでそれらを置くが、プログラム的コレクションビューのセルをタップすると、何もしません:

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 

私は多分のようなものを感じている(擬似コード)

starterPack[1].sendActionForEvent(UIEvent.Tap) 

は正しいですが、MSStickerViewは.sendActionForEvent

を持っていない私は絶望的です。偽のタップを作成するにはどうすればよいですか?

+0

私もこの問題に取り組んでいますが、あなたの代わりにstickerviewのイメージ図を使用してこの機能を実現し、あなたのcollectionviewセルのデリゲートメソッドのdidselectにしたい任意のアクションを実行したい場合は解決策を取得できませんでした。 –

答えて

0

MSMessageを作成する必要があります。現在MSConversationにはinsertを設定する必要があります。

Apples sample codeを参照してください。

+0

これは自動的にメッセージを送信しますか?私は必ずしもそれを送信する必要はありません、人々はテキストメッセージをドラフトのようなテキストのENTRYフィールドに入れて – skyguy

+0

送信しませんが、挿入します。サンプルコードを確認してください。 – shallowThought

+0

ステッカーだけを挿入するだけの問題があります。あなたはこれを前にしたことがありますか?最近の質問をご覧くださいhttp://stackoverflow.com/questions/41070206/problems-with-structs-in-swift-and-making-a-uiimage-from-url – skyguy

-1

明確にするために、UICollectionViewCellの束を表示しているUICollectionViewがあります。各UICollectionViewCellには、MSStickerViewがあります。私はこれが正しいと前進していくつもりです。

ユーザーは、コレクションビューセルの1つをタップすると、メッセージボックスにステッカーを挿入するので、ユーザーが送信ボタンをタップすると、ステッカーが送信されます。

このシナリオでは、UICollectionViewCellサブクラス内のMSStickerへの参照を維持することができます(サブクラスがあると仮定して、目的のために作成することをお勧めします)。次に、ユーザーがセルをタップしてdidSelectCellAtメソッドが呼び出されると、そのセルからMSStickerを取得してメッセージに挿入できます。作る

希望は意味

+0

ステッカーブロックdidSelectCellAtメソッド、あなたは@jeffを試しましたか? –

関連する問題