Я хочу разработать расширение 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 под пальцем, но я должен убрать палец с экрана и нажать снова, чтобы распознаватель жестов смог распознать мой жест.