触发点击MSSticker或以编程方式查看?

时间:2016-12-07 22:00:00

标签: ios swift imessage-extension msstickerview mssticker

好吧,我看过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上创建一个假的点击,这样它就会被放入入境领域。我不知道该怎么做。

我像这样创建我的MSStickerViews并将它们放在集合视图中,但是以编程方式点击集合视图单元格什么都不做(Ive尝试过):

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

我很绝望。如何制作假水龙头?

2 个答案:

答案 0 :(得分:0)

您必须创建一个MSMessage,而不是insert,而不是MSConversation

conversation.insert(message) { error in
    // handle error
}

请参阅Apples sample code

答案 1 :(得分:-1)

为了澄清,你有一个UICollectionView,你在其中显示一堆UICollectionViewCell,每个都有一个MSStickerView。假设这是正确的,我将继续前进。

您的目标是,当用户点击其中一个集合视图单元格时,您将贴纸插入消息框中,这样当用户点击发送按钮时,贴纸就会被发送,是吗?

在这种情况下,我要做的是在UICollectionViewCell子类中维护对MSSticker的引用(假设你有一个子类。如果你不这样做,我建议为你的目的制作一个)。然后,当用户点击一个单元格并调用didSelectCellAt方法时,您可以从该单元格中获取MSSticker并将其插入到您的消息中。

希望有意义