Как приостановить UIGestureRecognizer и запустить его после того, как что-то произошло? - PullRequest
0 голосов
/ 30 августа 2018

Я хочу разработать расширение iMessage, и у меня проблема с MSStikerView. Это представление из Messages.framework, и у него уже есть закрытый UILongPressGestureRecognizer.

<UILongPressGestureRecognizer: 0x106106ae0; state = Possible; 
view = <MessagesExtension.CustomStickerView 0x106121770>; 
target= <(action=handleLongPress:, target=< MessagesExtension.CustomStickerView 0x106121770>)

Когда этот жест распознан - Apple создает копию этого представления для выполнения функции перетаскивания. Все работает отлично, если этот вид уже настроен, но я хочу изменить изображение в этом виде, прежде чем произойдет перетаскивание Это означает, что мне нужно выполнить все изменения перед вызовом handleLongPress и сразу после распознавания LongPress. Что-то вроде:

0) Пользователь нажал на экран

1) LongPress распознается в моем коде

2) Выполнить некоторые изменения в другом потоке (это может быть медленно, потому что мне нужно создать новый образ и сохранить его в файловой системе)

3) Обновить этот стикер

4) Разрешить Apple распознавать LongPress в MSStickerView и выполнять перетаскивание

И все одним нажатием от пользователя. Мое текущее решение:

1) Найдите распознаватель LongPress в MSStickerView и установите делегата:

 for gestureRecognizer in gestureRecognizers ?? [] {
    if let longPressGestureRecognizer = gestureRecognizer as? UILongPressGestureRecognizer {
        longPressGestureRecognizer.delegate = self
    }
}

2) Выполнить все изменения с представлением в основном потоке

override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    updateStickerSync()
    return true
}

Но я хочу найти более элегантное решение этой проблемы. Идеальное решение вы можете увидеть в приложении Animoji. В этом приложении вы можете создавать StickerView и выполнять перетаскивание из одного действия LongPress.

Также я попытался распознать LongPress и создать новый MSStickerView под пальцем, но я должен убрать палец с экрана и нажать снова, чтобы распознаватель жестов смог распознать мой жест.

...