申し分なく、プログラムで 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
私は必死です。偽のタップを作成するにはどうすればよいですか?