2012-09-21 9 views

Antwort

1

Sicher, es möglich ist.

Jeder Bildschirm müsste eine UISwipeGestureRecognizer für die Swipes haben, dann einen Aufruf an die Tab-Leiste führen Sie die gewünschte Aktion. Das kann etwas sein, indem Sie den aktiven Tab auf beliebige Werte erhöhen oder verringern.

Um Code-Duplikation zu verhindern, könnten Sie eine benutzerdefinierte UIViewController erstellen und alle Ihre View-Controller von dort erben (oder ein paar andere Möglichkeiten).

20

Wenn Sie einen Tab-Controller verwenden, können Sie in jeder Tab-Ansicht einen Wisch-Gesten-Erkenner einrichten. Wenn der Gestenerkenner ausgelöst wird, kann er den TabBarController.selectedTabIndex ändern

Dieser Effekt wird nicht animiert, aber es wird die Registerkarten mit einer Wischgeste wechseln. Dies war ungefähr das, was ich verwendete, als ich eine App mit einer UITabBar mit Tasten auf der linken und rechten Seite hatte und Wischgesten um die aktive Registerkarte zu ändern.

- (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

So wäre es nicht möglich, wie im Android-Youtube-Beispiel im ursprünglichen Post zu animieren? – user1689272

+1

Ich habe in der Vergangenheit eine flexiblere Registerkarte Steuerelemente erstellt und es war eine viel benutzerdefinierte Lösung als das obige Beispiel der Tableiste. Das letzte Mal, als ich so etwas gemacht habe, habe ich einen wirklich langen View-Controller erstellt, der alle Section-View-Controller nebeneinander angeordnet hat (ich hatte 5 Sektionen, so dass VC die 5-fache Bildschirmbreite hatte). Die Navigation beinhaltete das Verschieben des Containers VC nach links und rechts. Es ist nicht die beste Methode, da alle VCs zu jeder Zeit im Speicher bleiben, aber es ist das Beste, was ich für das bekommen konnte, wofür ich es brauchte. Ich kann leider keine Code-Schnipsel von diesem zeigen. – skladek

+3

Ab iOS7 ist es möglich, 'UIPercentDrivenInteractiveTransition' mit einem benutzerdefinierten View-Controller-Übergang zu verwenden, um diesen Effekt zu erzielen. Im Grunde haben Sie einen Navigations-Controller mit einer benutzerdefinierten Push/Pop-Animation, um das Verschieben zu machen. UIPercentDrivenInteractiveTransition ermöglicht es, dass der Übergang als Schwenken und nicht als Wischen verfolgt wird. – skladek

6

die Sie interessieren,

- (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

Danke, es hilft wirklich. –

2

Angenommen, Sie verwenden UITabBarConroller

Ihr Alle Kind Viewcontrollers können Erben Sie von einer Klasse, die das ganze schwere Heben für Sie erledigt. Diese

ist, wie ich es getan

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) 
    } 
} 

Also alle Ihre Viewcontrollers, die Teil UITabControllers sind aus SwipableTabVC statt UIViewController erben.

Verwandte Themen