Жесты, которые крадут прикосновения, как многозадачность салфетки iOS - PullRequest
1 голос
/ 16 марта 2012

Я знаю, что я хочу сделать, но я озадачен тем, как это сделать: я хочу реализовать что-то вроде жестов многозадачности iOS.То есть я хочу «украсть» касания из любого представления внутри моей иерархии представлений, если число касаний больше, скажем, двух.Конечно, жесты не предназначены для управления многозадачностью, это просто прозрачное воровство касаний, которое мне нужно.

Так как это довольно сложное приложение (которое широко использует вложение viewController), я хочу этобыть прозрачным для представлений, с которыми это происходит (т.е. я хочу иметь возможность отображать произвольные представления и иерархии, включая UIScrollViews, MKMapViews, UIWebViews и т. д., без необходимости изменять их реализацию, чтобы они хорошо играли с моими жестами).

Простое добавление gestRecognizer к общему суперпредставлению не работает, поскольку подпредставления с включенным взаимодействием поглощают все касания, которые на них выпадают.

Добавление визуально прозрачного представления с поддержкой пользовательского интерфейса в качестве родственного элемента (но вфронт) иерархии основного вида также не работает, так как теперь этот вид съедает все прикосновения.Я экспериментировал с переопределением touchesBegan: и т. Д. В touchView, но перенаправление касаний на nextResponder не работает, потому что это будет обычное супервидение, по сути, направляя касания прямо вокруг представлений, которые должныполучать их, когда touchView отдает их.

Я уверен, что я не единственный, кто ищет решение для этого, и я уверен, что есть более умные люди, чем я, которые уже поняли это,Я даже подозреваю, что на самом деле это может быть не очень сложно, и, может быть, мой мозг сегодня не увидит лес за деревьями.Я благодарен за любые полезные ответы в любом случае:)

Ответы [ 3 ]

1 голос
/ 18 марта 2012

Возможный, но потенциально опасный (если вы не проявляете осторожность) подход заключается в создании подкласса UIWindow вашего приложения и переопределении метода sendEvent:.Поскольку этот метод вызывается для каждого события касания, полученного приложением, вы можете проверить его, а затем принять решение вызвать [super sendEvent:] (если касание не отфильтровано) или не вызывать его (если касание отфильтровано) или простоотложите его вызов, если вы все еще распознаете касание.

Другая возможность - поиграть с методом hitTest:withEvent:, но это потребует правильного размещения вашего воровского вида в подпредставлении, и я думаю, что это не так.хорошо подходят, когда у вас есть много контроллеров представления.Я считаю, что предыдущее решение более общего назначения.

1 голос
/ 17 марта 2012

Я бы предложил вам попробовать метод swizzling, переопределив штрихи, начатые в UIView.Я думаю, что лучший способ - сохранить в статической общей переменной количество касаний (чтобы каждое представление могло увеличивать / уменьшать это значение).Это очень простая идея, возьмите ее с крошкой соли.

Надеюсь, это поможет.

Чао!:)

0 голосов
/ 18 марта 2012

На самом деле, добавление распознавателя жестов к общему суперпредставлению является правильным способом сделать это. Но может показаться, что вам может потребоваться установить delaysTouchesBegan или cancelsTouchesInView (или оба), чтобы распознаватель жестов обрабатывал все перед тем, как пропустить его до дочерних представлений.

...