首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >触发器轻触MSSticker或以编程方式查看?

触发器轻触MSSticker或以编程方式查看?
EN

Stack Overflow用户
提问于 2016-12-08 06:00:00
回答 2查看 792关注 0票数 0

好吧,我已经看了How to trigger tap gesture recognizer of UIView programmatically和类似的问题,但找不到我正在寻找的东西。我正在构建一个iMessage应用程序扩展,并需要在MSSticker上以编程方式触发点击事件。

我用下面的类制作了自定义的MSStickerViews,当它被按下和/或点击时,它会检测到它,然后触发另一个函数,但是我不知道如何实际模拟这些点击,以便将贴纸放在输入字段中:

代码语言:javascript
复制
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,并将它们放在一个集合视图中,但是以编程方式点击集合视图单元格什么也不做(我已经尝试过了):

代码语言:javascript
复制
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

我有一种感觉,就像(伪代码)

代码语言:javascript
复制
starterPack[1].sendActionForEvent(UIEvent.Tap)

是正确的,但是MSStickerView没有.sendActionForEvent

我已经绝望了。我如何创建一个假的水龙头?

EN

回答 2

Stack Overflow用户

发布于 2016-12-08 06:14:16

你必须创建一个MSMessage,然后你可以insert到你当前的MSConversation

代码语言:javascript
复制
conversation.insert(message) { error in
    // handle error
}

参见Apples sample code

票数 0
EN

Stack Overflow用户

发布于 2016-12-14 01:32:33

为了清楚起见,您有一个UICollectionView,其中显示了一组UICollectionViewCell,每个UICollectionViewCell都有一个MSStickerView。假设这是正确的,我将继续前进。

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

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

希望这是有意义的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41028148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档