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
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);
}
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.
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
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étodoviewDidLoad
. 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 }
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.
I + 1 en esto solo para "Personas a las que les gusta copiar el código de pegado": D –
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.
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.
- 1. Colocando UIButton y otros objetos de UIControl dentro de MKAnnotationView y permitiendo la interacción del usuario
- 2. iPad: UIPageViewController navigationOrientation
- 3. Cambiar la transición UIPageViewController
- 4. UIScrollView o UIPageViewController
- 5. NSInternalInconsistencyException de UIPageViewController al girar
- 6. UIPageViewController velocidad de transición/duración?
- 7. interacción más allá de los límites de uiview
- 8. Cómo crear un UIButton personalizado dentro de UIAlertView
- 9. UIButton dentro de UIScrollView no se activa al tocar
- 10. Servicio de interacción vs Objetos de solicitud de interacción
- 11. interacción NSThread y UIViewController
- 12. utilizando el UIPageViewController en un guión gráfico
- 13. Rotación de UIPageViewController en Container View Controller
- 14. UIButton en UITableViewCell
- 15. Cómo configurar la primera página en UIPageViewController
- 16. C# TWAIN interacción
- 17. Interacción Apache + mod_wsgi
- 18. SVN Hudson JIRA interacción
- 19. interacción remota vs toma
- 20. Interacción de Silverlight y Javascript
- 21. Symfony Interacción de aplicaciones múltiples
- 22. Ejemplo de persistencia DCI (datos, contexto, interacción)
- 23. UIButton color de selección
- 24. IO y quizás Interacción de mónada
- 25. UIButton no interactuando durante la animación
- 26. UIPageViewController efecto de rebote de la última página?
- 27. MBProgressHUD deshabilitar la interacción con UITableViewController
- 28. UIButton retraso en el cambio de estado
- 29. Cocoa webView - Desactivar toda interacción
- 30. Recarga dinámicamente UIPageViewController después de que dataSource haya cambiado
Funciona en IOS6? –