Я попробовал немного другой подход, чтобы предотвратить 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. Но я считаю, что до сих пор я не использовал ничего недокументированного ... Если кто-то найдет это иначе, пожалуйста, сообщите мне.