Нажать на MSSticker или посмотреть программно?

Хорошо, я посмотрел на Как программно запускать распознаватель жестов касания UIView и похожие вопросы, но не могу найти то, что я ищу. Я создаю расширение приложения 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)
        }
    }
}

Причина, по которой простой вызов одной из перечисленных выше функций не сработает, заключается в том, что мне не нужно запускать какую-либо определенную функцию с помощью крана - мне просто нужно создать поддельный сигнал на MSSticker в MSStickerView, чтобы он был помещен в поле ввода. Я понятия не имею, как это сделать.

Я создаю свои 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

Я в отчаянии. Как я могу создать поддельный кран?

2 ответа

Вы должны создать MSMessageКоторый ты чем можешь insert к вашему нынешнему MSConversation,

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

См. Пример кода Apple.

Чтобы уточнить, у вас есть UICollectionView, где вы отображаете кучу UICollectionViewCell, каждый из которых имеет MSStickerView. Я собираюсь двигаться вперед, предполагая, что это правильно.

Ваша цель состоит в том, чтобы, когда пользователь нажимал на одну из этих ячеек представления коллекции, вы вставляли наклейку в окно сообщения, чтобы, когда пользователь нажимал кнопку отправки, наклейка отправлялась, верно?

В этом сценарии я хотел бы сохранить ссылку на MSSticker в вашем подклассе UICollectionViewCell (при условии, что у вас есть подкласс. Если у вас его нет, я предлагаю сделать его для ваших целей). Затем, когда пользователь касается ячейки и вызывается ваш метод didSelectCellAt, вы можете извлечь MSSticker из этой ячейки и вставить его в свое сообщение.

Надеюсь, что это имеет смысл

Другие вопросы по тегам