2012-09-21 12 views

Odpowiedz

1

Oczywiście, jest to możliwe.

Każdy ekran wymagałby przesunięcia o UISwipeGestureRecognizer, a następnie wykonania połączenia z paskiem karty wykonać żądaną akcję. Może to być wszystko, od zwiększania lub zmniejszania aktywnej karty do wszystkiego, co chcesz.

W trosce o zapobieganie powielaniu kodu można utworzyć niestandardowe UIViewController i wszystkie kontrolery widoku odziedziczyć stamtąd (lub kilka innych sposobów).

20

Jeśli korzystasz z kontrolera paska kart, możesz skonfigurować narzędzie do rozpoznawania gestów w widoku każdej karty. Po uruchomieniu programu do rozpoznawania gestów można go zmienić, aby zmienić działanie tabulatora gestem przesuwania. Efekt ten nie będzie animowany, ale nie będzie animowany. Było to w przybliżeniu to, czego użyłem, gdy miałem aplikację z UITabBarem z przyciskami po lewej i prawej stronie i gestami przesunięcia, aby zmienić aktywną kartę.

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

Czy nie byłoby możliwe animowanie, jak w przykładzie na Androidzie youtube w oryginalnym poście? – user1689272

+1

W przeszłości stworzyłem bardziej płynne elementy sterujące tabulatorem i było to o wiele bardziej niestandardowe rozwiązanie niż powyższy przykład paska kart. Ostatnim razem, gdy zrobiłem coś takiego, stworzyłem naprawdę długi kontroler widoku, który zawierał wszystkie kontrolery widoku przekroju ułożone obok siebie (miałem 5 sekcji, więc VC miał 5x szerokość ekranu). Nawigacja polegała na przesuwaniu kontenera VC w lewo i prawo. To nie jest najlepsza metoda, ponieważ wszystkie VC pozostają w pamięci przez cały czas, ale to najlepsze, co mogłem dostać za to, czego potrzebowałem. Nie mogę niestety pokazać żadnych fragmentów kodu z tego. – skladek

+3

Od wersji iOS7 możliwe jest użycie 'UIPercentDrivenInteractiveTransition' z niestandardowym przejściem kontrolera widoku w celu uzyskania tego efektu. Zasadniczo będziesz miał kontroler nawigacyjny z niestandardową animacją push/pop do przesuwania. UIPercentDrivenInteractiveTransition pozwoli śledzić przejście jako panoramę, a nie przesunięcie. – skladek

6

spróbować tego,

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

Dzięki, to naprawdę pomaga. –

2

Zakładając, że używasz UITabBarConroller

wszystkie swoje ViewControllers dziecko może Odziedzicz po klasie, która wykonuje dla ciebie wszystkie ciężkie ćwiczenia.

To jak mam zrobić to

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

Więc wszyscy twoi viewcontrollers które są częścią UITabControllers może dziedziczyć z SwipableTabVC zamiast UIViewController.

Powiązane problemy