¿Está permitido deshabilitar el desplazamiento en UIWebView?

90

Tengo que mostrar un artículo web con un UITableViewartículo debajo.

La única opción que encontré fue mostrar el artículo UIWebViewen el encabezado tableView.

Para hacer eso, tengo que obtener la altura del contenido de webView y tengo que deshabilitar el desplazamiento para webView.

Encontré dos soluciones para deshabilitar el desplazamiento:

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

o en JavaScript:

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

Escuché que la primera solución está prohibida por Apple pero no tengo ninguna prueba de ello. ¿Mi solicitud será rechazada al usar esta solución? Si es así, ¿puedo usar la segunda solución sin ser rechazado?

jsaddour
fuente

Respuestas:

297

A partir de iOS5, tenemos acceso directo a la vista de desplazamiento de UIWebView.
Puede deshabilitar el desplazamiento y los rebotes de esta manera:

webView.scrollView.scrollEnabled = NO; 
webView.scrollView.bounces = NO;
Alex Stanciu
fuente
3
muchas gracias, eso es exactamente lo que estaba buscando. @jsddour, ¡debes marcar esta respuesta como aceptada!
marcgg
Por alguna razón, esto no me funciona. :-( He puesto un ScrollView y he puesto un UIWebView en él. Luego establecí las 2 líneas anteriores en el método viewWillAppear. Pero el desplazamiento todavía funciona en la vista web. ¿Alguien puede ayudar? Solo para información, lo estoy ejecutando en Simulador de iOS 7.
Amogh Natu
¿cuál es el uso de webView.scrollView.bounces = NO;? ya que el código de la primera línea ha desactivado el desplazamiento.
Gon
1
Me encanta cuando las personas toman una respuesta y corren sin tomarse el tiempo para dar un voto positivo al colaborador. ¿No hay forma de notificar al usuario que elija una respuesta para votar?
John Cogan
1
for swift webView.scrollView.scrollEnabled = false / webView.scrollView.bounces = false
Chathuranga Silva
26

Dado que esta pregunta aún es aplicable, ¡hay una nueva forma de hacerlo! (iOS 7.0+, quizás iOS 6 también, no confirmado)

webView.scrollView.scrollEnabled = NO;

Cuídate :)

Ryan Copley
fuente
Lo que no entiendo es por qué eso no está en IB: /, cmon APPLE, ¿qué estás haciendo? ¡No obstante, una solución muy buena!
Mahmud Ahmad
20

Simplemente puede establecer la propiedad de interacción del usuario de la vista web en no ie

webView.userInteractionEnabled = NO;

Es bastante simple y funciona bien, gracias :)

Eshwar Chaitanya
fuente
28
Sin embargo, esto evita que se toquen los enlaces.
Graham Perks
@GrahamPerks He editado la respuesta con respecto a su comentario, por favor
revísela
12

para todas las versiones de ios, puede usar este código en lugar de setScrollEnabled:

for (UIView *view in webview.subviews) {
    if ([view isKindOfClass:[UIScrollView class]]) {
       UIScrollView *scrollView = (UIScrollView *)view;
       scrollView.scrollEnabled = NO;
    }
}
mturhan55
fuente
en primer lugar, intento el método "setScrollEnabled" y Apple rechazó mi ipa. Luego cambié este método y acepté.
mturhan55
12

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

Gobi M
fuente
10

Versión SWIFT 3

    webView.scrollView.bounces = false
    webView.scrollView.isScrollEnabled = false
Ahmed Safadi
fuente
7

Creo que el javascript

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

es la mejor solución.

En efecto :

Tu primer examen, o el

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

una (las mismas cosas) podría ser rechazada porque no está documentada, o hacer que su aplicación se bloquee en una actualización adicional de iOS.

Y el

[[myWebView scrollView] setBounces:NO];

El método no funcionará con iOS <5.

Martín
fuente
5
[[[WebView subviews] lastObject] setScrollingEnabled:NO];

eso lo solucionó para mí

theiOSDude
fuente
4
Sería tan incorrecto confiar en esto ya que no es una API expuesta.
Deepak Danduprolu
[[[Subvistas de WebView] lastObject] setScrollingEnabled: NO]; eso lo solucionó para mí. De todos modos, no responde a mi pregunta. Mi pregunta es ¿tengo permiso para hacer eso? Parece que está prohibido deshabilitar el desplazamiento a través del SDK. Pero no estoy seguro. ¿Y qué hay de deshabilitar el desplazamiento a través de javascript?
jsaddour
no hay evidencia de que mi sugerencia cause un rechazo por parte de Apple, de hecho, llamando a la última subvista en la matriz de subvistas y configurando scrollingEnabled contra la API expuesta? ¿seguramente?. y sí, hazlo porque puedes usarlo. aunque no tengo idea a través de javascript. lo siento.
theiOSDude
3
No, no deberías hacer esto. Como dice Deepak, no puede confiar en el orden interno indocumentado de las subvistas en uno de los elementos de la interfaz de usuario de Apple. Si cambian la estructura interna en una futura actualización del sistema operativo, su aplicación se bloqueará. Advierten específicamente sobre hacer esto en varios lugares, y muchas aplicaciones fallaron en la actualización a iPhone OS 3.0 solo porque lo hicieron.
Brad Larson
5

El primero es rechazado por Apple. Me pasó esta misma mañana.

Jane Sales
fuente
5

[[myWebView scrollView] setBounces: NO];

mafonya
fuente
4

No creo que Apple prohíba la primera opción.

Tu podrías intentar

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

Si no desea que ningún enlace funcione en su UIWebView, también puede hacerlo

[myWebView setUserInteractionEnabled:NO];
Nick Bull
fuente
4

Úselo:

[[webView scrollView] setBounces:NO];
[[webView scrollView] setScrollingEnabled:NO];
Pawel Molodkin
fuente
3

Prueba esto,

[(UIScrollView *)[[webView subviews] lastObject] setScrollEnabled:NO];    
Shanmugaraja G
fuente
3

Coloqué algunos UIWebViews dentro de a UIScrollViewy no se estaba desplazando para mí, a menos que desactive la interacción del usuario en las vistas web (incluso con [[webview scrollview] setScrollEnabled:NO]). Así que coloqué la UIWebViews dentro de a UIViewy eso funcionó para mí, pero luego los enlaces interactivos o divs en mi HTML dentro de la UIWebViewya no funcionaban.

Lo único que funcionó para mí es mantener el UIWebViewinterior UIScrollViewpara que las interacciones HTML funcionen, pero UIScrollingno.

Luego creé un delegado personalizado para que las vistas web escucharan window.open("http:/customEvent")que se llama desde el HTML contenido en la vista web. También agregué una detección de deslizamiento de JavaScript que activará mi evento personalizado.

Cuando el delegado de webview recibe esto, paso una notificación a un controlador que luego desplaza dinámicamente mi archivo UIScrollView. Obviamente tuve que construir una lógica para monitorear y desplazarme a la página anterior o siguiente. No es la solución más bonita, pero funciona para mí.

marca
fuente
3

Prueba esto en tu HTML ( <HEAD>etiqueta)

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

Desactivará el desplazamiento en su página web.

(funciona en cualquier página web, no solo UIWebView)

Gik
fuente
2

Necesitaba deshabilitar el desplazamiento porque descartar un teclado personalizado realmente estropeaba el desplazamiento con webView. Nada más funcionó y recurrí a algo como esto:

-(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;
    }
}
akiraspeirs
fuente
1

¿Es una UIWebview y una UITableView en una UIScrollview, y la configuración de la altura de la vista web (y la suma al ContentSize total de la Scrollview) es lo que desea?

Henrik Erlandsson
fuente
Casi. Pero parece menos complicado mostrar WebView en el encabezado tableView. Pero mi pregunta es: ¿Puedo deshabilitar el desplazamiento de webView a través del SDK? Si no, ¿puedo hacerlo a través de javascript?
jsaddour
1
[[[WebView subviews] lastObject] setScrollingEnabled:NO];
imran ahmed
fuente
1
Funcionará hasta la actualización donde cambiaría el lugar de la vista de desplazamiento
Martin