Поведение обработки касаний UIView изменилось с Xcode 4.2? - PullRequest
6 голосов
/ 17 октября 2011

Пару дней назад я обновил свой iPad до 5.0 и одновременно обновил Xcode до 4.2, чтобы я мог продолжать тестировать свои приложения.Теперь у меня проблемы с сенсорным кодом в нескольких приложениях, которые работали с предыдущими версиями Xcode.

Я подклассифицировал UIImageView, чтобы добавить некоторые функции перетаскивания, переопределив -(void)TouchesBegan и -(void)TouchesMoved.Я сделал не переопределение -(void)TouchesEnded в подклассе, но обработал это в контроллере представления для представления, содержащего представление изображения.

Я вытащил подкласс UIImageView в новый проектдля тестирования, и сузили проблему к факту, что родительский UIView (шаблон, созданный Xcode), кажется, не передает события прикосновения к контроллеру представления (также созданный Xcode).

Если я добавлю это к своему подклассу:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"touches ended event in ImageToDrag");
    [self.nextResponder touchesEnded:touches withEvent:event];
}

и это к контроллеру представления моего родительского представления:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"touches ended event in ViewController");
}

когда я отпущу изображение, которое яперетаскивая экран, я получаю "touches ended event in ImageToDrag", но не журнал от контроллера представления.

Однако, если я намеренно пропущу представление, выполнив это в подклассическом представлении:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"touches ended event in ImageToDrag");
    [[self.nextResponder nextResponder] touchesEnded:touches withEvent:event];
}

затем я получаю обе записи журнала.

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

Я проверил, что exclusiveTouch установлено на NO, а userInteractionEnabled установлено на YES в родительском представлении и подклассах UIImageView.

У меня также естьпротестировал компиляцию для iOS 5.0 и iOS 4.2 и развертывание тестового приложения на iPad для iOS 5 и iPad 4.3.1.

Единственный способ, которым я смог передать событие прикосновения к viewController, - это пропустить просмотр и использовать двойной nextResponder в подклассе.Хотя этот метод работает, он кажется мне хаком, и я уверен, что он вернется, чтобы укусить меня позже.

Кто-нибудь еще видел такое поведение?Могу ли я узнать, что UIView делает с моими сенсорными событиями?

Спасибо, Дэн

Ответы [ 2 ]

5 голосов
/ 19 октября 2011

Последние несколько часов я пытался отследить похожую проблему. Наконец-то удалось решить ее с помощью этого поста

На самом деле, похоже, мне только что удалось решить, используя подсказку https://devforums.apple.com/message/519690#519690
Раньше я просто перенаправил событие touchesEnded в self.nextResponder. Когда я добавил touchesBegan, Moved, Cancelled обработчики с аналогичными реализациями по мере касания закругления событие, кажется, всплывает до корневого представления контроллер.
Так что я думаю на iOS5, просмотры сбрасывают касанияЗакрытые события когда они не видели соответствующих прикосновений, начинаются.

Мне не нужно было добавлять Moved / etc. Я просто переадресовал на TouchesBegan, а затем TouchesEnded снова начал работать!

2 голосов
/ 17 октября 2011

Некоторая обработка касаний имела успех в iOS 5.0;особенно если вы повторно связываете свое приложение с 5.0 SDK.

В разделе есть методы обработки касаний UIView, в которых говорится следующее:

Если вы переопределяете этот метод без вызова super (обычноиспользовать шаблон), вы также должны переопределить другие методы для обработки сенсорных событий, хотя бы в качестве реализаций заглушки (empy).

Так что, если вы делаете один, вам нужно сделать их все.Я знаю, что UIKit начал предпринимать шаги, чтобы убедиться, что это так и было в 5.0.

Так что я бы начал с этого - переопределил все методы в вашем представлении и посмотрим, что произойдет.

...