0

申し分なく、プログラムで UIView のタップ ジェスチャ認識エンジンをトリガーする方法と同様の質問を見てきましたが、探しているものが見つかりません。私は iMessage アプリの拡張機能を構築していますが、プログラムで 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)
        }
    }
}

上記のタップ関数の 1 つを呼び出すだけでは機能しない理由は、タップで特定の関数をトリガーする必要がないためです。入力欄。これを行う方法がわかりません。

このように 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

私は必死です。偽のタップを作成するにはどうすればよいですか?

4

2 に答える 2

0

明確にするために、UICollectionViewCell の束を表示している UICollectionView があり、それぞれに MSStickerView があります。これが正しいと仮定して先に進みます。

目的は、ユーザーがこれらのコレクション ビュー セルの 1 つをタップしたときにステッカーをメッセージ ボックスに挿入して、ユーザーが送信ボタンをタップしたときにステッカーが送信されるようにすることです。正しいですか?

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

それが理にかなっていることを願っています

于 2016-12-13T17:32:32.870 に答える