好吧,我已经看了How to trigger tap gesture recognizer of UIView programmatically和类似的问题,但找不到我正在寻找的东西。我正在构建一个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)
}
}
}仅仅调用上面的一个tap函数不起作用的原因是我不需要用tap触发任何特定的函数-我只需要在MSStickerView中的MSSticker上创建一个假的tap,这样它就会被放入输入字段中。我不知道该怎么做。
我像这样创建我的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
我已经绝望了。我如何创建一个假的水龙头?
发布于 2016-12-08 06:14:16
你必须创建一个MSMessage,然后你可以insert到你当前的MSConversation。
conversation.insert(message) { error in
// handle error
}发布于 2016-12-14 01:32:33
为了清楚起见,您有一个UICollectionView,其中显示了一组UICollectionViewCell,每个UICollectionViewCell都有一个MSStickerView。假设这是正确的,我将继续前进。
您的目标是,当用户点击其中一个集合视图单元格时,您将贴纸插入到消息框中,这样当用户点击发送按钮时,贴纸就会被发送,对吗?
在该场景中,我要做的是在UICollectionViewCell子类中维护对MSSticker的引用(假设您有一个子类。如果您不这样做,我建议为您的目的制作一个)。然后,当用户点击某个单元格时,您的didSelectCellAt方法将被调用,您可以从该单元格获取MSSticker并将其插入到消息中。
希望这是有意义的
https://stackoverflow.com/questions/41028148
复制相似问题