Я попробовал немного другой подход, чтобы предотвратить прокрутку и отскок объектов UIWebView : добавление распознавателя жестов для переопределения других жестов.
Похоже, что UIWebView или его подпредставление прокрутки использует собственный распознаватель жестов панорамирования для обнаружения пользовательской прокрутки. Но согласно документации Apple, существует законный способ заменить один распознаватель жестов другим. Протокол UIGestureRecognizerDelegate имеет метод gestRecognizer: shouldRecognizeSim одновременноouslyWithGestureRecognizer: -, который позволяет контролировать поведение любых распознавателей столкновения жестов.
Итак, что я сделал
в методе viewDidLoad контроллера представления:
// Install a pan gesture recognizer // We ignore all the touches except the first and try to prevent other pan gestures
// by registering this object as the recognizer's delegate
UIPanGestureRecognizer *recognizer;
recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
recognizer.delegate = self;
recognizer.maximumNumberOfTouches = 1;
[self.view addGestureRecognizer:recognizer];
self.panGestureFixer = recognizer;
[recognizer release];
затем метод переопределения жестов:
// Control gestures precedence
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
// Prevent all panning gestures (which do nothing but scroll webViews, something we want to disable in
// the most painless way)
if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]])
{
// Just disable every other pan gesture recognizer right away
otherGestureRecognizer.enabled = FALSE;
}
return NO;
}
Конечно, этот метод делегата может быть более сложным в реальном приложении - мы можем выборочно отключить другие распознаватели, анализируя otherGestureRecognizer.view и принимая решение на основе того, что это за представление.
И, наконец, ради полноты, метод, который мы зарегистрировали как обработчик панорамирования:
- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer
{
// do nothing as of yet
}
он может быть пустым, если все, что нам нужно, это отменить прокрутку и отскок веб-просмотров, или он может содержать наш собственный код для реализации движений панорамирования и анимации, которые мы действительно хотим ...
Пока что я просто экспериментирую со всем этим, и кажется, что он работает более или менее так, как я этого хочу. Я пока не пытался отправить какие-либо приложения в iStore. Но я считаю, что до сих пор я не использовал ничего недокументированного ... Если кто-то найдет это иначе, пожалуйста, сообщите мне.