tutorial open example crear iphone objective-c uiwebview

iphone - open - ¿Detener UIWebView de "rebotar" verticalmente?



uiwebview tutorial (22)

(Ejemplo de Xcode 5 iOS 7 SDK) Aquí hay un ejemplo de aplicación universal que utiliza la función scrollBoot setBounces. Es un proyecto / ejemplo de código abierto que se encuentra aquí: Enlace a SimpleWebView (Ejemplo de Código Postal y Código Fuente del Proyecto)

¿Alguien sabe cómo evitar que un UIWebView rebote verticalmente? Quiero decir, cuando un usuario toca la pantalla de su iPhone, arrastra el dedo hacia abajo y la vista web muestra un espacio en blanco sobre la página web que había cargado.

He visto las siguientes soluciones posibles, pero ninguna de ellas funcionó para mí:

http://www.iphonedevsdk.com/forum/iphone-sdk-development/996-turn-off-scrolling-bounces-uiwebview.html

http://forums.macrumors.com/showthread.php?t=619534

¿Cómo puedo evitar que un UIScrollView rebote horizontalmente?


Advertencia. Utilicé setAllowsRubberBanding: en mi aplicación, y Apple lo rechazó, afirmando que las funciones API no públicas no están permitidas (cite: 3.3.1)



Bueno, todo lo que hice para lograr esto es:

UIView *firstView = [webView.subviews firstObject]; if ([firstView isKindOfClass:[UIScrollView class]]) { UIScrollView *scroll = (UIScrollView*)firstView; [scroll setScrollEnabled:NO]; //to stop scrolling completely [scroll setBounces:NO]; //to stop bouncing }

Funciona bien para mí ... Además, la respuesta marcada para esta pregunta es una que Apple rechazará si la usa en su aplicación de iPhone.


El método de Brad funcionó para mí. Si lo usas, querrás hacerlo un poco más seguro.

id scrollView = [yourWebView.subviews objectAtIndex:0]; if( [scrollView respondsToSelector:@selector(setAllowsRubberBanding:)] ) { [scrollView performSelector:@selector(setAllowsRubberBanding:) withObject:NO]; }

Si Apple cambia algo, entonces el rebote volverá, pero al menos tu aplicación no se bloqueará.


En Swift para deshabilitar los rebotes.

webViewObj.scrollView.bounces = false


En el iOS 5 SDK puede acceder a la vista de desplazamiento asociada con una vista web directamente en lugar de iterar a través de sus subvistas.

Entonces, para deshabilitar el ''rebote'' en la vista de desplazamiento puede usar:

myWebView.scrollView.bounces = NO;

Ver la referencia de la clase UIWebView .

(Sin embargo, si necesita admitir versiones del SDK antes de la 5.0, debe seguir el consejo de Mirek Rusin ).


Encontré esta búsqueda de una respuesta y, finalmente, tuve la suerte de encontrar una respuesta por mi cuenta. yo si

[[webview scrollView] setBounces:NO];

Y funcionó.


Estaba buscando un proyecto que facilita la creación de aplicaciones web como aplicaciones instalables de pleno derecho en el iPhone llamado QuickConnect , y encontré una solución que funciona, si no desea que la pantalla sea desplazable, que en mi caso No lo hice

En la publicación de proyecto / blog mencionada anteriormente, mencionan una función javascript que puede agregar para desactivar el rebote, que esencialmente se reduce a esto:

document.ontouchmove = function(event){ event.preventDefault(); }

Si desea ver más sobre cómo lo implementan, simplemente descargue QuickConnect y verifíquelo ... Pero básicamente todo lo que hace es llamar a ese javascript en la carga de la página ... Traté de ponerlo en el encabezado de mi documento. y parece funcionar bien.


Esto funcionó para mí, y muy bien también (estoy usando phonegap con webView)

[[webView.webView scrollView] setScrollEnabled:NO];

o

[[webView scrollView] setScrollEnabled:NO];


Intenté un enfoque ligeramente diferente para evitar que los objetos UIWebView se desplacen y reboten: agregar un reconocedor de gestos para anular otros gestos.

Parece que UIWebView o su subvista de desplazamiento utiliza su propio reconocedor de gestos de paneo para detectar el desplazamiento del usuario. Pero de acuerdo con la documentación de Apple, hay una forma legítima de anular un reconocedor de gestos con otro. El protocolo UIGestureRecognizerDelegate tiene un método gestoRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer: - que permite controlar el comportamiento de los reconocedores de gestos en colisión.

Entonces, lo que hice fue

en el método viewDidLoad del controlador de vista:

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

entonces, el método de anulación de gestos:

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

Por supuesto, este método de delegado puede ser más complejo en una aplicación real: podemos deshabilitar otros reconocedores de forma selectiva, analizar otras vistas del Recurso del Gesto y tomar una decisión basada en qué vista es.

Y, finalmente, en aras de la integridad, el método que registramos como un controlador de bandeja:

- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer { // do nothing as of yet }

puede estar vacío si lo único que queremos es cancelar el desplazamiento y el rebote de las vistas web, o puede contener nuestro propio código para implementar el tipo de movimientos de paneo y animaciones que realmente queremos ...

Hasta ahora solo estoy experimentando con todo esto, y parece que funciona más o menos como lo deseo. Sin embargo, todavía no he intentado enviar ninguna aplicación a iStore. Pero creo que no he usado nada sin documentar hasta ahora ... Si alguien encuentra lo contrario, infórmeme.


Me molestó descubrir que UIWebView no es una vista de desplazamiento, así que hice una subclase personalizada para obtener la vista de desplazamiento de la vista web. Este suclass contiene una vista de desplazamiento para que pueda personalizar el comportamiento de su vista web. Los punzones de esta clase son:

@class CustomWebView : UIWebview ... - (id) initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; // WebViews are subclass of NSObject and not UIScrollView and therefore don''t allow customization. // However, a UIWebView is a UIScrollViewDelegate, so it must CONTAIN a ScrollView somewhere. // To use a web view like a scroll view, let''s traverse the view hierarchy to find the scroll view inside the web view. for (UIView* v in self.subviews){ if ([v isKindOfClass:[UIScrollView class]]){ _scrollView = (UIScrollView*)v; break; } } return self;

}

Luego, cuando creas una vista web personalizada, puedes deshabilitar el rebote con:

customWebView.scrollView.bounces = NO; //(or customWebView.scrollView.alwaysBounceVertically = NO)

Esta es una gran forma de propósito general para hacer una vista web con un comportamiento de desplazamiento personalizable. Sólo hay algunas cosas a tener en cuenta:

  • como con cualquier vista, también deberá anular - (id) initWithCoder: si lo usa en Interface Builder
  • cuando crea una vista web inicialmente, el tamaño de su contenido es siempre el mismo que el tamaño del marco de la vista. Después de desplazarse por la web, el tamaño del contenido representa el tamaño de los contenidos web reales dentro de la vista. Para solucionar esto, hice algo intrincado: llamar a -setContentOffset: CGPointMake (0,1) animated: YES para forzar un cambio imperceptible que establecerá el tamaño de contenido adecuado de la vista web.

Me parece que el UIWebView tiene un UIScrollView. Puede usar las API documentadas para esto, pero el rebote se establece para ambas direcciones, no individualmente. Esto está en los documentos API. UIScrollView tiene una propiedad de rebote, así que algo como esto funciona (no sé si hay más de una vista de desplazamiento):

NSArray *subviews = myWebView.subviews; NSObject *obj = nil; int i = 0; for (; i < subviews.count ; i++) { obj = [subviews objectAtIndex:i]; if([[obj class] isSubclassOfClass:[UIScrollView class]] == YES) { ((UIScrollView*)obj).bounces = NO; } }


Mira en la propiedad de bounces de UIScrollView . Quoth los documentos de Apple:

Si el valor de la propiedad es YES (el valor predeterminado), la vista de desplazamiento rebota cuando encuentra un límite del contenido. El rebote visual indica que el desplazamiento ha alcanzado un borde del contenido. Si el valor es NO , el desplazamiento se detiene inmediatamente en el límite del contenido sin rebotar.

Asegúrese de que está utilizando el UIScrollView correcto. No estoy seguro de cómo se ve la jerarquía para un UIWebView , pero la vista de desplazamiento puede ser un elemento primario, no un elemento secundario, de UIWebView .


Para deshabilitar el desplazamiento de UIWebView , puede usar la siguiente línea de código:

[ObjWebview setUserInteractionEnabled:FALSE];

En este ejemplo, ObjWebview es de tipo UIWebView .


Recorrí la colección de subvistas de UIWebView y establecí sus fondos en [UIColor blackColor], el mismo color que el fondo de la página web. La vista aún rebotará, pero no mostrará ese feo fondo gris oscuro.


Solo en iOS5 si planea permitir que los usuarios amplíen el contenido de la vista web (ei: doble toque) la configuración de rebote no es suficiente. También debe establecer las propiedades alwaysBounceHorizontal y alwaysBounceVertical en NO, de lo contrario, cuando se alejen (otra doble pulsación ...) para el valor predeterminado, volverá a rebotar.


Swift 3

webView.scrollView.bounces = false


Una de las subvistas de UIWebView debe ser un UIScrollView . Establezca su propiedad scrollEnabled en NO y la vista web tendrá el desplazamiento deshabilitado por completo.

Nota: esto es técnicamente utilizando una API privada y, por lo tanto, su aplicación podría ser rechazada o bloquearse en futuras versiones del sistema operativo. Usa @try y respondsToSelector


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



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

... parece funcionar bien.

También será aceptado en la App Store.

Actualización : en iOS 5.x + hay una forma más fácil: UIWebView tiene la propiedad scrollView , por lo que su código puede verse así:

webView.scrollView.bounces = NO;