Я спробував дещо інший підхід, щоб запобігти прокрученню та відскоку об’єктів UIWebView : додавання розпізнавача жестів для зміни інших жестів.
Здається, UIWebView або його підрозділ прокрутки використовує власний розпізнавальник жестів панорами для виявлення прокрутки користувача. Але згідно з документацією Apple, існує законний спосіб перекрити один розпізнавальник жестів іншим. Протокол UIGestureRecognizerDelegate має метод gestureRecognizer: shouldRecognizeSim istovremenoWithGestureRecognizer: - який дозволяє контролювати поведінку будь-яких розпізнавальників жестів, що стикаються.
Отже, те, що я зробив
у методі 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. Але я вважаю, що до цього часу не використовував нічого недокументованого ... Якщо хтось виявить інше, будь ласка, повідомте мене.