2011-11-07 13 views
9

Estoy usando un UIPageViewController en mi aplicación y quería tener algunos UIButtons dentro de él, algo así como un menú. El problema que tengo es que cuando coloco un UIButton (o cualquier otro elemento interactivo) cerca de los bordes de la pantalla y lo toco, en lugar de aplicar la acción UIButton, lo que ocurre es que la página cambia (porque el toque en el borde de la pantalla cambia la página en el UIPageViewController). Me gustaría saber si hay una manera de hacerlo para que UIButton tenga mayor prioridad que UIPageViewController, de modo que cuando toco el botón, aplica la acción adecuada en lugar de cambiar la página.UIButton interacción dentro de UIPageViewController

Respuesta

6

Vine aquí con el mismo problema. El link de Split tiene la respuesta.

que el controlador de vista raíz del delegado de cada uno de los reconocedores gesto del UIPageViewController 's, y luego evitar toques de ser entregado si ocurren dentro de cualquier UIControl:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    return ([touch.view isKindOfClass:[UIControl class]] == NO); 
} 
4

UIPageViewController tiene dos UIGestureRecognizers. Puede acceder a ellos a través de la propiedad gestureRecognizers. Determine cuál es UITapGestureRecognizer y luego use this. Espero que esto ayude.

+0

Funciona en IOS6? –

1

comentar estas línea de su código

self.view.gestureRecognizers = self.pageViewController.gestureRecognizers; 

o utilizar UIGestureRecognizer según lo dicho por división

Hope esto le ayudará a

0

tenía este mismo problema, y ​​era seguro cómo manejar los métodos de delegado de UIGestureRecognizer. Este pequeño ejemplo supone que está utilizando el tipo de proyecto "aplicación basada en la página" en Xcode 4. Esto es lo que hice:

  • En RootViewController.h, que se aseguró de anunciar que RootViewController manejaría el protocolo UIGestureRecognizerDelegate:

    @interface RootViewController : UIViewController <UIPageViewControllerDelegate, UIGestureRecognizerDelegate> 
    
  • En RootViewController.m, asigné RootViewController como el delegado para el UITapGestureRecognizer. Esto se hace al final del método viewDidLoad. Hice esto iterando sobre cada gestureRecognizer para ver cuál era el UITAPGestureRecognizer.

    NSEnumerator *gestureLoop = [self.view.gestureRecognizers objectEnumerator]; 
    id gestureRecognizer; 
    while (gestureRecognizer = [gestureLoop nextObject]) { 
        if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) { 
         [(UITapGestureRecognizer *)gestureRecognizer setDelegate:self]; 
        } 
    } 
    
  • Por último, he añadido el gestureRecognizer: Método shouldReceiveTouch a la parte inferior de RootViewController.m (Esto es copiado directamente de enlace de Split):

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
        if ([touch.view isKindOfClass:[UIControl class]]) { 
         // we touched a button, slider, or other UIControl 
         return NO; // ignore the touch 
        } 
        return YES; // handle the touch 
    } 
    
2

Para las personas que sólo quieren copiar/pegar el código, aquí está el mío:

// I don't want the tap on borders to change the page 
-(void) desactivatePageChangerGesture { 
    for (UIGestureRecognizer* gestureRecognizer in self.pageViewController.gestureRecognizers) { 
     if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) { 
      gestureRecognizer.enabled = NO; 
     } 
    } 
} 

Simplemente llame a esta función después del UIPageViewControll er creación.

+0

I + 1 en esto solo para "Personas a las que les gusta copiar el código de pegado": D –

0

vieja respuesta: Si su UIPageViewController tiene un transitionStyle de UIPageViewControllerTransitionStyleScroll y se encuentra en iOS 6.0+, entonces no puede usar el método gestureRecognizer:shouldReceiveTouch:, porque no hay forma de configurar el delegado en self en el gestureRecognizers ya que pageViewController.gestureRecognizers devolverá nulo. Consulte UIPageViewController returns no Gesture Recognizers in iOS 6 para obtener más información al respecto.

Si simplemente quiere asegurarse de que sus UIPageViewController pasa a lo largo de eventos de botón táctil con un UIButton, puede utilizar

for (UIScrollView *view in _pageViewController.view.subviews) { 
    if ([view isKindOfClass:[UIScrollView class]]) { 
     view.delaysContentTouches = NO; 
    } 
} 

si tiene un transitionStyle de UIPageViewControllerTransitionStyleScroll y se encuentra en iOS 6.0 o superior.

Ver this answer acerca de por qué delaysContentTouches = NO se necesita para algunos casos de un UIButton en una actualización UIScrollView

: Después de hacer un poco más de investigación, parece que si el problema es que el UIButton clic parece ser llamado solamente veces, entonces ese es en realidad probablemente el comportamiento deseado dentro de un UIScrollView. Un UIScrollView usa la propiedad delaysContentTouches para determinar automáticamente si el usuario estaba tratando de desplazarse o tratar de presionar un botón dentro de la vista de desplazamiento. Supongo que es mejor no alterar este comportamiento a NO de manera predeterminada, ya que al hacerlo se perderá la capacidad de desplazamiento si el dedo del usuario está sobre un botón.

0

Ninguna de las soluciones aquí donde se interceptan los reconocedores de gestos de toque de UIPageViewController funcionó para mí. Estoy focalización iOS 8 y 9.

Lo que funcionó es anular las funciones de touchesBegan, touchesCancelled, touchesMoved y touchesEnded en mi botón personalizado que es una subclase de UIControl. Luego, solo envío manualmente el evento de control .TouchUpInside si el toque comenzó y finalizó dentro del marco de mi botón personalizado.

No tuve que hacer nada especial para el controlador de vista de página que contiene, o el controlador de vista que contiene el controlador de vista de página.

Cuestiones relacionadas