Tentei uma abordagem ligeiramente diferente para impedir que os objetos UIWebView rolassem e pulassem: adicionando um reconhecedor de gestos para substituir outros gestos.
Parece que o UIWebView ou sua subvisualização de rolagem usa seu próprio reconhecedor de gesto de panorâmica para detectar a rolagem do usuário. Mas, de acordo com a documentação da Apple, existe uma maneira legítima de substituir um reconhecedor de gestos por outro. O protocolo UIGestureRecognizerDelegate possui um método gestRecognizer: shouldRecognizeSimultaneamenteWithGestureRecognizer: - que permite controlar o comportamento de qualquer reconhecedor de gestos em colisão.
Então, o que eu fiz foi
no método viewDidLoad do controlador de exibição:
// 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];
então, o gesto substitui o método:
// 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;
}
Obviamente, esse método delegado pode me tornar mais complexo em um aplicativo real - podemos desativar outros reconhecedores seletivamente, analisando otherGestureRecognizer.view e tomando decisões com base em qual é a visão.
E, finalmente, por uma questão de integridade, o método que registramos como manipulador de pan:
- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer
{
// do nothing as of yet
}
pode estar vazio se tudo o que queremos é cancelar a rolagem e a rejeição das visualizações da web, ou pode conter nosso próprio código para implementar o tipo de movimentos e animações de pan que realmente queremos ...
Até agora, estou apenas experimentando todas essas coisas, e parece estar funcionando mais ou menos como eu quero. Ainda não tentei enviar aplicativos para o iStore. Mas acredito que não usei nada não documentado até agora ... Se alguém achar o contrário, informe-me.