gpt4 book ai didi

swift - iOS 10 iMessage 贴纸应用程序中 MSSticker Peels 的回调

转载 作者:IT王子 更新时间:2023-10-29 05:19:21 25 4
gpt4 key购买 nike

我正在 iOS 10 中试验贴纸 iMessage 应用程序,我遇到了 override func didStartSending(_ message: MSMessage, conversation: MSConversation) 方法在 MSMessagesAppViewController 中的问题。当从 MSStickerView 中“剥离”贴纸时,我希望在 didStartSending 方法上收到某种回调。但事实并非如此。有谁知道这是否是预期的行为和/或当这些贴纸被剥离、拖动和放入 MSConversation 时是否有另一种订阅回调的方法?我意识到 didStartSending 是为用户点击发送按钮保留的,但肯定应该有 一些 方式知道用户何时拖动 MSStickers 而无需将一些 UIView 拖动/矩形组合在一起-阅读启发式。

消息 View Controller :

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?
}

}

贴纸浏览器:

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]
}

}

最佳答案

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

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

关于swift - iOS 10 iMessage 贴纸应用程序中 MSSticker Peels 的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38441987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com