首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MSSticker 10 iMessage标签应用程序中回调iMessage剥皮

在MSSticker 10 iMessage标签应用程序中回调iMessage剥皮
EN

Stack Overflow用户
提问于 2016-07-18 16:42:33
回答 2查看 2.7K关注 0票数 16

我正在iOS 10中尝试粘贴iOS应用程序,并且遇到了MSMessagesAppViewController中的override func didStartSending(_ message: MSMessage, conversation: MSConversation)方法的问题。当从MSStickerView中“剥离”一个贴纸时,我希望能收到一些关于didStartSending方法的回调。但情况似乎并非如此。有人知道这是否是预期的行为和/或是否有另一种方式订阅回调,当这些贴纸被剥离,拖放到MSConversation中?我意识到didStartSending是为用户点击“发送”按钮时保留的,但是应该有一些方法可以知道什么时候用户拖动MSStickers,而不需要将一些UIView拖拽/重读启发。

消息视图控制器:

代码语言:javascript
复制
class MessagesViewController: MSMessagesAppViewController {

    var nYCStickersBroswerViewController: NYCStickersBroswerViewController!

    override func viewDidLoad() {
        super.viewDidLoad()
        nYCStickersBroswerViewController = NYCStickersBroswerViewController(stickerSize: .regular)
        nYCStickersBroswerViewController.view.frame = self.view.frame

        self.addChildViewController(nYCStickersBroswerViewController)
        nYCStickersBroswerViewController.didMove(toParentViewController: self)
        self.view.addSubview(nYCStickersBroswerViewController.view)

        nYCStickersBroswerViewController.loadStickers()
        nYCStickersBroswerViewController.stickerBrowserView.reloadData()
    }

    ...

    override func didStartSending(_ message: MSMessage, conversation: MSConversation) {
        // Called when the user taps the send button.
        print(message) // should this not contain the sticker that is peeled, dragged, and dropped into the conversation?
    }

 }

贴纸浏览器:

代码语言:javascript
复制
import Foundation
import UIKit
import Messages

class ASSticker: MSSticker {
    var identifier: String?
}

class NYCStickersBroswerViewController: MSStickerBrowserViewController {

    var stickers = [ASSticker]()

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func changeBrowswerViewBackgroundColor(color: UIColor) {
        stickerBrowserView.backgroundColor = color
    }

    func loadStickers() {
        createSticker(name: "brooklyn", localizedDescription: "Brooklyn Bridge Sticker")
        createSticker(name: "liberty", localizedDescription: "Statue of Liberty Sticker")
        createSticker(name: "love", localizedDescription: "I Love New York Sticker")
        createSticker(name: "mets", localizedDescription: "New York Mets Sticker")
        createSticker(name: "rangers", localizedDescription: "New York Rangers Sticker")
        createSticker(name: "subway", localizedDescription: "New York City MTA Subway Train Sticker")
    }

    func createSticker(name: String, localizedDescription: String) {
        guard let stickerPath = Bundle.main.pathForResource(name, ofType: "png") else {
            print("Call ae cab, you're intoxicated.")
            return
        }
        let stickerURL = URL(fileURLWithPath: stickerPath)
        let sticker: ASSticker
        do {
            try sticker = ASSticker(contentsOfFileURL: stickerURL, localizedDescription: localizedDescription)
            sticker.identifier = "something unique"
            stickers.append(sticker)
        } catch {
            print("Call a cab, you're intoxicated.")
        }
    }

    override func numberOfStickers(in stickerBrowserView: MSStickerBrowserView) -> Int {
        return self.stickers.count
    }
    override func stickerBrowserView(_ stickerBrowserView: MSStickerBrowserView, stickerAt index: Int) -> MSSticker {
        return self.stickers[index]
    }

}
EN

回答 2

Stack Overflow用户

发布于 2016-09-13 15:41:18

下面是一个子类和委托,它将绑定到MSStickerView用于选择和剥离交互的点击和长按压手势识别器中。如果MSStickerView的实现发生变化,这可能不再提供事件,但不应该崩溃。

代码语言:javascript
复制
import UIKit
import Messages

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(self)
        }
    }

    func didLongPress(longPressGestureRecognizer: UILongPressGestureRecognizer) {
        if longPressGestureRecognizer.state == .Began {
            delegate?.stickerViewDidPeel(self)
        }
    }
}
票数 16
EN

Stack Overflow用户

发布于 2016-08-17 23:06:56

这是一个解决贴纸剥皮和点击事件的方法,不能保证会插入特定的贴纸,而是类似于这样的数据点--您必须使用MSStickerView的子类。这个解决方案不是未来的,而是暂时有效的,因此我欢迎其他的想法。

代码语言:javascript
复制
import UIKit
import Messages

class CustomStickerView : MSStickerView{
    class GestureRecognizerReceiver : NSObject, UIGestureRecognizerDelegate{
        func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
            return true
        }
    }
    let _recognizerDelegate = GestureRecognizerReceiver()

    weak var _recognizer: UITapGestureRecognizer? = nil
    func setupTapRecognizer(){
        if _recognizer == nil {
            let r = UITapGestureRecognizer(target: self, action: #selector(_customTapReceived))
            r.cancelsTouchesInView = false
            r.delegate = _recognizerDelegate
            addGestureRecognizer(r)
            _recognizer = r
    }
}

    func _customTapReceived(){
        if let s = sticker{
            Analytics.shared.reportEvent(name: "Sticker Inserted", description: s.localizedDescription)
        }
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        if let s = sticker{
            Analytics.shared.reportEvent(name: "Sticker Peeled", description: s.localizedDescription)
        }

    }
}

用法:

代码语言:javascript
复制
let sv = CustomStickerView(frame: _stickerViewHolder.bounds, sticker: sticker)
sv.setupTapRecognizer()
_stickerViewHolder.addSubview(sv)
sv.startAnimating()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38441987

复制
相关文章

相似问题

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