viewpager tutorial pageview page control iphone ios uipageviewcontroller

iphone - tutorial - uipageviewcontroller swift 4



Error de aserciĆ³n en UIQueuingScrollView didScrollWithAnimation: force: (5)

¡Encontré una solución! En mi caso, tengo un UIPageViewController con UIPageViewControllerTransitionStyleScroll , así como los siguientes botones que permiten al usuario avanzar a través de mi viewpager tocando. Estoy recibiendo este bloqueo cuando el usuario presiona el siguiente botón y se arrastra ligeramente antes de soltar el dedo (aún dentro del marco del botón). Parece que el arrastre dentro del botón está interfiriendo con el reconocedor de gestos panorámicos de UIPageViewController en este caso, y eso es lo que causa el bloqueo.

Si bien es bastante improbable que el usuario se ponga en este estado, he encontrado una solución relativamente simple que impide que mi aplicación falle si ocurre. Tengo un booleano que representa si el usuario está en un estado válido para pasar a la pantalla siguiente y establecerlo en SÍ al tocar hacia abajo, luego a NO si el usuario se arrastra a alguna parte dentro de mi botón. Luego, en touchUp (nextPressed) compruebo el booleano antes de mover mi UIPageViewController programáticamente.

- (IBAction)touchDown:(id)sender { self.shouldAdvanceToNextScreen = YES; } - (IBAction)touchDragInside:(id)sender { self.shouldAdvanceToNextScreen = NO; } - (IBAction)nextPressed:(id)sender { if (self.shouldAdvanceToNextScreen) { UIViewController *initialViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"TutorialScreen2"]; NSArray *viewControllers = [NSArray arrayWithObject:initialViewController]; [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil]; } }

La desventaja es que no pasará nada aunque el usuario haya soltado el dedo dentro del marco del botón. Sin embargo, prefiero esto en un accidente y veo esto como un caso de borde bastante raro independientemente. Esperaría que el usuario simplemente toque nuevamente, esta vez sin un toque y arrastre, y avance con éxito.

Agradecería cualquier idea sobre llevar esto un paso más allá y evitar el choque entre la resistencia táctil y el UIPageViewController completo.

Tengo un UIPageViewController configurado UIPageViewController mi ImageViewController .

ImageViewController contiene un UIScrollView con un UIImageView dentro. Nada más.

Estoy probando en este momento con 3 "elementos" en mi UIPageViewController datos para UIPageViewController (es decir, tres páginas).

Todo funciona bien y puedo desplazarme y acercarme y acercarme a la página durante unos 30 segundos, y de repente aparece esta advertencia ...

*** Assertion failure in -[_UIQueuingScrollView _didScrollWithAnimation:force:], /SourceCache/UIKit/UIKit-2372/_UIQueuingScrollView.m:778

No tengo idea de por dónde empezar a depurarlo, ya que no apunta a ninguno de mis códigos y no hay ninguno de mi código en la pila ni nada.

¿Puede alguien darme un puntero sobre dónde comenzar a depurar esto?

EDITAR

He hecho un poco más de prueba. Parece suceder si el scrollView se desacelera (es decir, después de una película) y luego trato de hacer la transición del PageViewController a otro ViewController a medida que la vista de desplazamiento todavía se está moviendo.

La aplicación se bloquea alrededor del 20% del camino a través de la transición a la página siguiente.

EDIT 2

El error parece detenerse en la línea _cache_getImp (no estoy seguro si eso es una L mayúscula o minúscula).

EDIT 3

Esto se pone mejor. Acabo de descargar la aplicación de muestra PhotoScroller de Apple para ver si resolvieron el problema de otra manera. Bueno, no, no lo hicieron. ¡La aplicación de ejemplo se bloquea exactamente de la misma manera que la mía! Tiene que hacer zoom y desplazarse y hacer la transición de las páginas al mismo tiempo para que sea más probable que se cuelgue, pero esto sucede por sí solo, pero puede llevar más tiempo.


¿Has intentado deshabilitar el rebote en UIScrollView? Eso funcionó para mí y resolvió mi otro problema al que aludí en mi comentario anterior.


He estado luchando con esto todo el día. Mis conclusiones:

Si tiene una vista de desplazamiento como la que muestra ViewController y usted es delegado de las volutas: tiene problemas. Incluso con el PageViewController configurado con desplazamiento horizontal, un desplazamiento vertical en su vista activará un evento. -> esto no causa problemas si: se desplaza hacia atrás hasta la parte superior de su vista antes (No estoy seguro de cómo solucionarlo).

Hay buenos hilos de como este .

Básicamente la solución es:

1 [yourView setViewControllers:yourControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

2 Utilice UIPageViewControllerTransitionStylePageCurl como estilo de transición.

Esto solucionó la mayoría de mis problemas.

Si alguien tiene una solución para la delegación, problemas con el desplazamiento, serán bienvenidos


Seguramente se parece a un error en iOS 8 y 9. (y las "respuestas" a continuación intentan solucionarlo)

Siéntase libre de presentar un ticket en bugreport.apple.com Asegúrese de especificar cómo bloquear PhotoScroller

Incluye todas las versiones de iOS que has visto bloquearse

Hasta la fecha que he visto:

Fallo de aserción en - [XXX.TrackingPageViewController queuingScrollView: didEndManualScroll: toRevealView: direction: animated: didFinish: didComplete:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3512.60.12/UIPageViewController.m : 2028

Fallo de aserción en - [_ UIQueuingScrollView _didScrollWithAnimation: force:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3512.60.12/_UIQueuingScrollView.m:785 (lldb)

Mantendré la lista actualizada (a pesar de la baja, masiva). Manténganse al tanto.

No se parece a nuestro error.

UPD 2016 09 27 (en Xcode 8 ahora):

Fallo de aserción en - [XXX.TrackingPageViewController queuingScrollView: didEndManualScroll: toRevealView: direction: animated: didFinish: didComplete:], /SourceCache/UIKit/UIKit-3347.44.2.2/UIPageViewController.m:1875

increíble


Tuve un problema similar. Mi configuración era un UIPageViewController y estaba cargando controladores de vista con un UIImageView dentro. Al interactuar mientras se desplazaba el UIPageViewController obtuve el mismo registro de bloqueo.

Lo arreglé creando un UILongPressGestureRecognizer y UILongPressGestureRecognizer a la vista de desplazamiento de UIPageViewController .

  1. Creé mi propia subclase de UIPageViewController (La solución es específica para mi caso pero puede usarse fácilmente como una solución genérica)

  2. Encuentra el UIScrollView interno del UIPageViewController

    - (UIScrollView *)findScrollView { UIScrollView *scrollView; for (id subview in self.view.subviews) { if ([subview isKindOfClass:UIScrollView.class]) { scrollView = subview; break; } } return scrollView; }

  3. Agregue el reconocedor de gestos de toque largo a la vista de desplazamiento interior y apunte su acción a un método o nulo

    /** * On tap-hold the page view controller crashes as soon as it pages to a new view controller. * Setting a long press gesture to ignore the hold. */ - (void)listenForLongPressGestureOnScrollView:(UIScrollView *)scrollView { UILongPressGestureRecognizer *longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:nil]; [longPressGestureRecognizer setMinimumPressDuration:0.5]; [scrollView addGestureRecognizer:longPressGestureRecognizer]; }