Поведение касания UIView изменилось в Xcode 4.2?

Я обновил свой 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");
}

когда я отпускаю изображение, которое перетаскиваю по экрану, я получаю событие "касание завершено. в ImageToDrag ", но не в журнале контроллера представления.

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

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

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

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

Я проверил, что для параметра exclusiveTouch установлено значение НЕТ , а для параметра userInteractionEnabled установлено значение ДА в родительском представлении и подклассах. UIImageView .

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

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

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

Спасибо, Дэн

6
задан Bo Persson 16 October 2011 в 21:14
поделиться