¿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?

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;

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 :)


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 :)


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;
    }
}

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


10

Versión SWIFT 3

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

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.


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

eso lo solucionó para mí


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



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];

4

Úselo:

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

3

Prueba esto,

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

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í.


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)


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;
    }
}

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?


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];

1
Funcionará hasta la actualización donde cambiaría el lugar de la vista de desplazamiento
Martin
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.