Desativar a rolagem em um UIWebView permitido?


90

Eu tenho que mostrar um artigo da web com um UITableViewabaixo do artigo.

A única opção que encontrei foi exibir o artigo em um UIWebViewno cabeçalho tableView.

Para fazer isso, preciso obter a altura do conteúdo do webView e desativar a rolagem do webView.

Encontrei duas soluções para desativar a rolagem:

for (id subview in webView.subviews)
    if ([[subview class] isSubclassOfClass: [UIScrollView class]])
        ((UIScrollView *)subview).scrollEnabled=NO;

ou em JavaScript:

<script type="text/javascript">
touchMove = function(event) {
    event.preventDefault();
}

Ouvi dizer que a primeira solução é proibida pela Apple mas não tenho nenhuma prova disso. Minha inscrição será rejeitada com o uso desta solução? Em caso afirmativo, posso usar a segunda solução sem ser rejeitado?

Respostas:


297

A partir do iOS5, temos acesso direto ao scrollview do UIWebView.
Você pode desativar a rolagem e saltos como este:

webView.scrollView.scrollEnabled = NO; 
webView.scrollView.bounces = NO;

3
muito obrigado, isso é exatamente o que eu estava procurando. @jsddour, você deve marcar esta resposta como aceita!
marcgg

Por algum motivo, isso não está funcionando para mim. :-( Eu coloquei um ScrollView e coloquei um UIWebView nele. Em seguida, defina as 2 linhas acima no método viewWillAppear. Mas o scroll ainda funciona no modo de exibição da web. Alguém pode ajudar ?? Apenas para obter informações, estou executando-o em Simulador iOS 7.
Amogh Natu

de que adianta webView.scrollView.bounces = NO;? já que o código da primeira linha desabilitou a rolagem.
Gon

1
Adoro quando as pessoas respondem e correm sem perder tempo dando um voto favorável ao colaborador. Não há como notificar o usuário para escolher uma resposta para votar?
John Cogan

1
para swift webView.scrollView.scrollEnabled = false / webView.scrollView.bounces = false
Chathuranga Silva

26

Uma vez que esta questão ainda é aplicável, existe uma nova maneira de fazê-lo! (iOS 7.0+, talvez iOS 6 também, não confirmado)

webView.scrollView.scrollEnabled = NO;

Cuidar :)


O que eu não entendo é por que isso não está no IB: /, vamos APPLE o que você está fazendo! Muito boa solução, no entanto!
Mahmud Ahmad

20

Você pode simplesmente definir a propriedade de interação do usuário da visualização da web como no ie

webView.userInteractionEnabled = NO;

É muito simples e funciona bem, obrigado :)


28
No entanto, isso impede que os links sejam acessados.
Graham Perks de

@GrahamPerks Eu editei a resposta com relação ao seu comentário, por favor, analise e aprove, obrigado :)
Eshwar Chaitanya

12

para todas as versões ios, você pode usar este código em vez de setScrollEnabled:

for (UIView *view in webview.subviews) {
    if ([view isKindOfClass:[UIScrollView class]]) {
       UIScrollView *scrollView = (UIScrollView *)view;
       scrollView.scrollEnabled = NO;
    }
}

em primeiro lugar, tentei o método "setScrollEnabled" e a apple rejeitou meu ipa. Então mudei esse método e aceitei.
mturhan55 de

12

Use este <body ontouchmove="event.preventDefault()">


9

Versão SWIFT 3

    webView.scrollView.bounces = false
    webView.scrollView.isScrollEnabled = false

7

Eu acho que o Javascript

<script type="text/javascript">
touchMove = function(event) {
event.preventDefault();
}

é de longe a melhor solução.

De fato :

Seu primeiro exemplo, ou o

[[[WebView subviews] lastObject] setScrollingEnabled:NO];

uma (mesmas coisas) pode ser rejeitada por não estar documentada ou fazer seu aplicativo travar em uma nova atualização do ios.

E a

[[myWebView scrollView] setBounces:NO];

método não funciona com iOS <5.


5
[[[WebView subviews] lastObject] setScrollingEnabled:NO];

isso resolveu para mim


4
Seria muito errado confiar nisso, pois não é uma API exposta.
Deepak Danduprolu

[[[Subvisualizações WebView] lastObject] setScrollingEnabled: NO]; isso resolveu para mim. De qualquer forma, isso não responde à minha pergunta. Minha pergunta é que tenho permissão para fazer isso? Parece que desativar a rolagem pelo SDK é proibido. Mas eu não tenho certeza. E que tal desativar a rolagem por javascript.
jsaddour

não há evidências de que minha sugestão causaria uma rejeição por apple, de fato, chamando a última subiew na matriz subviews e definindo scrollingEnabled contra ela é API exposta? certamente?. e sim vá em frente porque você pode usá-lo. nenhuma ideia via javascript embora. Desculpe.
theiOSDude de

3
Não, você não deve fazer isso. Como Deepak diz, você não pode confiar na ordem interna não documentada de subvisualizações em um dos elementos da IU da Apple. Se eles mudarem a estrutura interna em uma atualização futura do sistema operacional, seu aplicativo irá travar. Eles alertam especificamente sobre fazer isso em vários lugares, e muitos aplicativos quebraram na atualização para o iPhone OS 3.0 apenas porque fizeram isso.
Brad Larson

5

O primeiro é rejeitado pela Apple. Aconteceu comigo esta manhã.



4

Não acho que a primeira opção seja proibida pela Apple.

Você poderia tentar

[[[Webview subviews] lastObject] setScrollingEnabled:NO];

Se você não quiser que nenhum link funcione em seu UIWebView, você também pode fazer

[myWebView setUserInteractionEnabled:NO];

4

Use-o :

[[webView scrollView] setBounces:NO];
[[webView scrollView] setScrollingEnabled:NO];

3

Tente isto,

[(UIScrollView *)[[webView subviews] lastObject] setScrollEnabled:NO];    

3

Coloquei alguns UIWebViews dentro de um UIScrollViewe ele não estava rolando para mim, a menos que eu desabilitasse a interação do usuário nos webviews (mesmo com o [[webview scrollview] setScrollEnabled:NO]). Coloquei os UIWebViews dentro de um UIViewe funcionou para mim, mas os links interativos ou divs em meu HTML dentro do UIWebViewnão funcionaram mais.

A única coisa que funcionou para mim é manter o UIWebViewinterior do UIScrollViewpara que as interações HTML funcionem, mas UIScrollingnão.

Em seguida, criei um delegado personalizado para os webviews ouvirem window.open("http:/customEvent")que é chamado a partir do HTML contido no webview. Também adicionei uma detecção de furto de JavaScript que acionará meu evento personalizado.

Quando o delegado do webview recebe isso, eu passo uma notificação para um controlador que então rola dinamicamente o meu UIScrollView. Obviamente, tive que construir uma lógica para monitorar e rolar para a página seguinte ou anterior. Não é a solução mais bonita, mas está funcionando para mim.


3

Experimente isso em seu HTML ( <HEAD>tag)

<script> 
  document.ontouchmove = function(event) { event.preventDefault(); }
</script>

Isso desativará a rolagem em sua página da web.

(funciona em qualquer página da web, não apenas UIWebView)


2

Eu precisei desabilitar a rolagem porque dispensar um teclado personalizado realmente atrapalhou a rolagem com o webView. Nada mais funcionou e eu recorri a algo assim:

-(void)viewDidLoad{
  [super viewDidLoad];
  [self.webView.scrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
  self.webView.scrollView.showsVerticalScrollIndicator = NO;
}  

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if (!CGPointEqualToPoint(self.webView.scrollView.contentOffset, CGPointZero)){
        self.contentOffset = CGPointZero;
    }
}

1

É um UIWebview e um UITableView em um UIScrollview, e definir a altura do webview (e adicionar ao ContentSize total do Scrollview) como o que você deseja?


Quase. Mas parece menos complicado exibir o WebView no cabeçalho tableView. Mas minha pergunta é: Tenho permissão para desativar a rolagem do webView pelo SDK? Se não estou autorizado a fazer isso através do javascript?
jsaddour

1
[[[WebView subviews] lastObject] setScrollingEnabled:NO];

1
funcionará até a atualização onde o lugar da visualização da rolagem mudaria
Martin
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.