Исправлен UIScrollView для передачи событий вверх по цепочке, а не вниз - PullRequest
0 голосов
/ 26 июня 2010

UIView, которые не обрабатывают свои события, передают их по цепочке.По умолчанию это передает их родительскому представлению и, если не обрабатывается (в конечном счете), их родительскому UIViewController.

UIScrollView ломает это (есть много вопросов по SO, вариации на тему «почему мое приложение»перестать работать, как только я добавлю UIScrollView?)

UISV решает, является ли событие для себя, и если нет, он передает его ВНИЗ (в свои подпредставления), если они не обрабатывают событие, UISV просто выбрасываетЭто ошибка.

В этом случае предполагается отбросить их обратно к своему собственному родительскому представлению - и, в конечном счете, к родительскому UIVC. AFAICT, вот почему так много людей запутываются: это не работает какзадокументировано (примечание: поскольку представления задокументированы; UISV просто «недокументирован» по этому вопросу - он не объявляет, что он намерен делать в этой ситуации).

Итак ...Есть ли легкое исправление для этой ошибки? Есть ли категория, которую я мог бы написать, чтобы исправить UISV в целом и избежать необходимости создавать "поддельные" подклассы UIView, которые существуют чистозахватить события и передать их туда, куда они должны идти?(что делает для подверженного ошибкам кода)

В частности, из документов Apple:

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

... если бы я мог переопределить этот метод "если таймер срабатывает" и правильно его реализовать , я думаю, что смог бы исправить все мои экземпляры UISV.

Но: - считает ли Apple это «использованием частного API» (их описание «частного» бессмысленно в обычных терминах программирования, и я не могу понять, что они делают и не имеют в виду под этим) - кто-нибудь знаетчто это за метод или как найти его?(возможно, отладка скомпилированных классов ObjC для поиска имен символов)

1 Ответ

0 голосов
/ 27 июня 2010

Я нашел частичный ответ, это правильно, но не на 100% пригодно для использования: (.

iPhone OS 4.0 позволяет удаленно добавлять прослушиватели к данному представлению через класс UIGestureRecognizer. Это здорово, иработает аккуратно.

Единственная проблема ... это не будет работать на любых iPhone 3.x и iPod Touch.

(но если вы ориентируетесь на 4.0 и выше, это простопуть вперед)

РЕДАКТИРОВАТЬ:

В OS 3.x я создал пользовательский подкласс UIView, который имеет дополнительные свойства:

NSObject *objectToDelegateToOnTouch;
id touchSourceIdentifier;

При каждом касании,view отправляет сенсорное сообщение непосредственно в objectToDelegateToOnTouch, но с дополнительным параметром touchSourceIdentifier.

Таким образом, всякий раз, когда вы получаете сенсорный экран, вы знаете, откуда оно пришло (вы можете использовать объект или строкуили все, что вы хотите в качестве «идентификатора»).

...