Disabilitare lo scorrimento su un UIWebView consentito?


90

Devo mostrare un articolo web con UITableViewsotto l'articolo.

L'unica opzione che ho trovato è stata quella di visualizzare l'articolo in UIWebViewa nell'intestazione tableView.

Per fare ciò devo ottenere l'altezza del contenuto di webView e devo disabilitare lo scorrimento per il webView.

Ho trovato due soluzioni per disabilitare lo scorrimento:

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

o in JavaScript:

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

Ho sentito che la prima soluzione è vietata da Apple ma non ne ho alcuna prova. La mia domanda verrà rifiutata utilizzando questa soluzione? In tal caso, posso utilizzare la seconda soluzione senza essere rifiutato?

Risposte:


297

A partire da iOS5 abbiamo accesso diretto alla visualizzazione a scorrimento di UIWebView.
Puoi disabilitare lo scorrimento e i rimbalzi in questo modo:

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

3
grazie mille, è esattamente quello che stavo cercando. @jsddour, dovresti contrassegnare questa risposta come accettata!
marcgg

Per qualche motivo, questo non funziona per me. :-( Ho messo uno ScrollView e ho inserito un UIWebView in esso. Quindi imposta le 2 linee sopra nel metodo viewWillAppear. Ma lo scroll funziona ancora nella visualizzazione Web. Qualcuno può aiutare ?? Solo per informazioni, lo sto eseguendo in Simulatore iOS 7.
Amogh Natu

a cosa serve webView.scrollView.bounces = NO;? poiché il codice nella prima riga ha disabilitato lo scorrimento.
Gon

1
Adoro quando le persone prendono una risposta e corrono senza perdere tempo per dare al contributore un voto positivo. Non c'è modo di avvisare l'utente di scegliere una risposta per votare?
John Cogan

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

26

Poiché questa domanda è ancora applicabile, c'è un nuovo modo per farlo! (iOS 7.0+, forse anche iOS 6, non confermato)

webView.scrollView.scrollEnabled = NO;

Stai attento :)


Quello che non capisco è perché non è in IB: /, cmon APPLE cosa stai facendo! Soluzione comunque molto bella!
Mahmud Ahmad

20

Puoi semplicemente impostare la proprietà di interazione utente della vista web su no ie

webView.userInteractionEnabled = NO;

È abbastanza semplice e funziona bene, grazie :)


28
Tuttavia, ciò impedisce che i collegamenti vengano toccati.
Graham Perks

@GrahamPerks Ho modificato la risposta rispetto al tuo commento, gentilmente
esaminalo

12

per tutte le versioni ios puoi usare questo codice invece di setScrollEnabled:

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

in primo luogo, provo il metodo "setScrollEnabled" e Apple ha rifiutato il mio ipa. Poi ho cambiato questo metodo e ho accettato.
mturhan55

12

Usa questo <body ontouchmove="event.preventDefault()">


9

Versione SWIFT 3

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

7

Penso che il Javascript

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

è di gran lunga la soluzione migliore.

Infatti :

Il tuo primo esempio, o il file

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

una (le stesse cose) potrebbe essere rifiutata perché non documentata, o farti andare in crash dell'app in un ulteriore aggiornamento ios.

E il

[[myWebView scrollView] setBounces:NO];

il metodo non funziona con iOS <5.


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

che ha risolto il problema per me


4
Sarebbe così sbagliato fare affidamento su questo in quanto non è un'API esposta.
Deepak Danduprolu

[[[WebView subviews] lastObject] setScrollingEnabled: NO]; che ha risolto il problema per me. Comunque, non risponde alla mia domanda. La mia domanda è che mi è permesso farlo? Sembra che disabilitare lo scorrimento nell'SDK sia vietato. Ma non sono sicuro. E che dire della disabilitazione dello scorrimento tramite javascript.
jsaddour

non ci sono prove che il mio suggerimento provocherebbe un rifiuto da parte di apple, infatti, chiamando l'ultima sottovisione nell'array delle sottoviste e impostando scrollingEnabled contro di essa è esposta l'API? certamente?. e sì, fallo perché puoi usarlo. nessuna idea tramite javascript però. spiacente.
theiOSDude

3
No, non dovresti farlo. Come dice Deepak, non puoi fare affidamento sull'ordine interno non documentato delle visualizzazioni secondarie in uno degli elementi dell'interfaccia utente di Apple. Se cambiano la struttura interna in un futuro aggiornamento del sistema operativo, l'applicazione andrà in crash. Avvertono specificamente di farlo in più punti e molte applicazioni hanno fallito nell'aggiornamento a iPhone OS 3.0 solo perché lo hanno fatto.
Brad Larson

5

Il primo viene rifiutato da Apple. A me è successo proprio questa mattina.



4

Non credo che la prima opzione sia vietata da Apple.

Potresti provare

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

Se non vuoi che i link funzionino in UIWebView, puoi farlo anche

[myWebView setUserInteractionEnabled:NO];

4

Usalo:

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

3

Prova questo,

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

3

Ho inserito alcuni messaggi UIWebViewall'interno di a UIScrollViewe non stava scorrendo per me, a meno che non disabiliti l'interazione dell'utente sulle visualizzazioni web (anche con [[webview scrollview] setScrollEnabled:NO]). Quindi ho inserito la UIWebViews all'interno di a UIViewe ha funzionato per me, ma poi i link interattivi o div nel mio HTML all'interno del fileUIWebView non funzionavano più.

L'unica cosa che ha funzionato per me è mantenere l' UIWebViewinterno in UIScrollViewmodo che le interazioni HTML funzionino ma il fileUIScrolling non lo fanno.

Ho quindi creato un delegato personalizzato per le visualizzazioni Web per l'ascolto window.open("http:/customEvent")che viene chiamato dall'HTML contenuto nella visualizzazione Web. Ho anche aggiunto un rilevamento di scorrimento JavaScript che attiverà il mio evento personalizzato.

Quando il delegato webview riceve questo messaggio, passo una notifica a un controller che quindi scorre dinamicamente il mio file UIScrollView. Ovviamente ho dovuto costruire una logica per monitorare e scorrere alla pagina successiva o precedente. Non è la soluzione più carina, ma per me funziona.


3

Prova questo nel tuo HTML ( <HEAD>tag)

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

Disabiliterà lo scorrimento sulla tua pagina web.

(funziona su qualsiasi pagina web, non solo su UIWebView)


2

Avevo bisogno di disabilitare lo scorrimento perché chiudere una tastiera personalizzata ha davvero incasinato lo scorrimento con il webView. Nient'altro ha funzionato e ho fatto ricorso a qualcosa del genere:

-(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

Un UIWebview e un UITableView su un UIScrollview e l'impostazione dell'altezza della webview (e l'aggiunta al ContentSize totale di Scrollview) sono come quello che vuoi?


Quasi. Ma sembra meno complicato visualizzare il WebView nell'intestazione tableView. Ma la mia domanda è: sono autorizzato a disabilitare lo scorrimento di WebView attraverso l'SDK? In caso contrario, posso eseguire queste operazioni tramite javascript?
jsaddour

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

1
funzionerà fino all'aggiornamento in cui cambierà la posizione della visualizzazione a scorrimento
Martin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.