2012-09-21 15 views

Respuesta

1

Claro que es posible.

Cada pantalla debería tener un UISwipeGestureRecognizer para los deslizamientos, luego realice una llamada a la barra de pestañas para realizar la acción deseada. Lo cual puede ser cualquier cosa, desde incrementar o disminuir la pestaña activa a cualquier cosa que desee.

En aras de la prevención de duplicación de código, puede crear un UIViewController personalizado y todos sus controladores de vista heredan de allí (o de otras maneras).

20

Si está utilizando un controlador de barra de pestañas, puede configurar un reconocedor de gestos de barrido en la vista de cada pestaña. Cuando se activa el reconocedor de gestos, puede cambiar tabBarController.selectedTabIndex

Este efecto no se verá animado, sino que cambiará las pestañas con un gesto de deslizamiento. Esto fue aproximadamente lo que usé cuando tenía una aplicación con una UITabBar con botones en el lado izquierdo y derecho y gestos de deslizamiento para cambiar la pestaña activa.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(tappedRightButton:)]; 
    [swipeLeft setDirection:UISwipeGestureRecognizerDirectionLeft]; 
    [self.view addGestureRecognizer:swipeLeft]; 

    UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(tappedLeftButton:)]; 
    [swipeRight setDirection:UISwipeGestureRecognizerDirectionRight]; 
    [self.view addGestureRecognizer:swipeRight]; 
} 

- (IBAction)tappedRightButton:(id)sender 
{ 
    NSUInteger selectedIndex = [rootVC.tabBarController selectedIndex]; 

    [rootVC.tabBarController setSelectedIndex:selectedIndex + 1]; 
} 

- (IBAction)tappedLeftButton:(id)sender 
{ 
    NSUInteger selectedIndex = [rootVC.tabBarController selectedIndex]; 

    [rootVC.tabBarController setSelectedIndex:selectedIndex - 1]; 
} 
+0

¿No sería posible animar como en el ejemplo de youtube de Android en la publicación original? – user1689272

+1

He creado controles de pestañas más fluidos en el pasado y era una solución mucho más personalizada que el ejemplo anterior de la barra de pestañas. La última vez que hice algo así, creé un controlador de vista muy largo que contenía todos los controladores de vista de sección colocados uno al lado del otro (tenía 5 secciones, de modo que VC tenía 5 veces el ancho de la pantalla). La navegación implicaba deslizar el contenedor VC hacia la izquierda y hacia la derecha. No es el mejor método ya que todos los VCs permanecen en la memoria en todo momento, pero es lo mejor que puedo obtener para lo que necesito. No puedo mostrar ningún fragmento de código desafortunadamente. – skladek

+3

A partir de iOS7, es posible usar 'UIPercentDrivenInteractiveTransition' con una transición de controlador de vista personalizada para lograr este efecto. Básicamente, tendrá un controlador de navegación con una animación personalizada push/pop para hacer el deslizamiento. UIPercentDrivenInteractiveTransition permitirá la transición para rastrear como una panorámica en lugar de deslizar. – skladek

6

probar esto,

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(tappedRightButton:)]; 
    [swipeLeft setDirection:UISwipeGestureRecognizerDirectionLeft]; 
    [self.view addGestureRecognizer:swipeLeft]; 

    UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(tappedLeftButton:)]; 
    [swipeRight setDirection:UISwipeGestureRecognizerDirectionRight]; 
    [self.view addGestureRecognizer:swipeRight]; 
} 

- (IBAction)tappedRightButton:(id)sender 
{ 
    NSUInteger selectedIndex = [rootVC.tabBarController selectedIndex]; 

    [self.tabBarController setSelectedIndex:selectedIndex + 1]; 

    //To animate use this code 
    CATransition *anim= [CATransition animation]; 
    [anim setType:kCATransitionPush]; 
    [anim setSubtype:kCATransitionFromRight]; 
    [anim setDuration:1]; 
    [anim setTimingFunction:[CAMediaTimingFunction functionWithName: 
            kCAMediaTimingFunctionEaseIn]]; 
    [self.tabBarController.view.layer addAnimation:anim forKey:@"fadeTransition"]; 
} 

- (IBAction)tappedLeftButton:(id)sender 
{ 
    NSUInteger selectedIndex = [rootVC.tabBarController selectedIndex]; 

    [self.tabBarController setSelectedIndex:selectedIndex - 1]; 

    CATransition *anim= [CATransition animation]; 
    [anim setType:kCATransitionPush]; 
    [anim setSubtype:kCATransitionFromRight]; 

    [anim setDuration:1]; 
    [anim setTimingFunction:[CAMediaTimingFunction functionWithName: 
           kCAMediaTimingFunctionEaseIn]]; 
    [self.tabBarController.view.layer addAnimation:anim forKey:@"fadeTransition"]; 
} 
+0

Gracias, realmente ayuda. –

2

Suponiendo que está usando UITabBarConroller

Todos a su hijo ViewControllers puede Heredar de una clase que hace todo el trabajo pesado por ti.

Esta es la forma en que lo he hecho

class SwipableTabVC : UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let left = UISwipeGestureRecognizer(target: self, action: #selector(swipeLeft)) 
     left.direction = .left 
     self.view.addGestureRecognizer(left) 

     let right = UISwipeGestureRecognizer(target: self, action: #selector(swipeRight)) 
     right.direction = .right 
     self.view.addGestureRecognizer(right) 
    } 

    func swipeLeft() { 
     let total = self.tabBarController!.viewControllers!.count - 1 
     tabBarController!.selectedIndex = min(total, tabBarController!.selectedIndex + 1) 

    } 

    func swipeRight() { 
     tabBarController!.selectedIndex = max(0, tabBarController!.selectedIndex - 1) 
    } 
} 

lo tanto todas sus viewcontrollers que forman parte de UITabControllers puede heredar de SwipableTabVC en lugar de UIViewController.

Cuestiones relacionadas