申し訳ありませんが、私は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
を持っていない私は絶望的です。偽のタップを作成するにはどうすればよいですか?
私もこの問題に取り組んでいますが、あなたの代わりにstickerviewのイメージ図を使用してこの機能を実現し、あなたのcollectionviewセルのデリゲートメソッドのdidselectにしたい任意のアクションを実行したい場合は解決策を取得できませんでした。 –