【问题标题】:Trigger tap on MSSticker or view programmatically?触发点击 MSSticker 或以编程方式查看?
【发布时间】:2016-12-07 21:59:59
【问题描述】:

好的,我查看了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)
        }
    }
}

只调用上面的一个点击函数不起作用的原因是我不需要用点击触发任何特定的函数 - 我只需要在 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

我很绝望。如何创建假水龙头?

【问题讨论】:

  • 我也解决了这个问题,但如果你想实现这个功能,你可以使用图像视图而不是贴纸视图,并在你的 collectionview 单元委托方法中执行任何你想要的操作,但没有得到解决方案。跨度>

标签: ios swift imessage-extension msstickerview mssticker


【解决方案1】:

您必须创建一个MSMessage,然后您可以将insert 改为您当前的MSConversation。

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

见Apples sample code。

【讨论】:

  • 这会自动发送消息吗?我不一定要发,只要放在文本ENTRY字段中,就像人们起草短信的地方一样
  • 我在单独插入贴纸时遇到了一些问题。你以前做过吗?你能看看我最近的问题吗stackoverflow.com/questions/41070206/…
  • “你以前做过吗?”:你可以通过查看工作示例代码自己做。使用诸如“我遇到一些问题”之类的错误描述,没有人能够帮助您。另外,不接受和/或投票赞成我的正确答案并不会促使我进一步研究您的问题。
  • @shallowThought 这个策略有一个问题,当你自己发送消息时,你的消息中的图像和贴纸视图上的一个图像,所以两者同时发送了插入调用,所以有时你会看到你被覆盖的插入功能不正常。
【解决方案2】:

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

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

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

希望这是有道理的

【讨论】:

  • 贴纸块 didSelectCellAt 方法,你试过@jeff 吗?
猜你喜欢
  • 1970-01-01
  • 2021-06-04
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多