2010-06-25 12 views
14

Moja aplikacja posiada kontroler nawigacji i nie chcę żadnej animacji w nim:Zapobieganie animacji po kliknięciu przycisku "Wstecz" na pasku nawigacji?

  • aby zapobiec animację podczas pchania widok, to proste, poprzez pushViewController: animowane: metoda

  • ale kiedy kliknę przycisk "wstecz" w tym wyglądzie, jest animacja! KO! Co mogę zrobić, aby zapobiec tej animacji?

+7

dlaczego chcesz złamać UI z niestandardowego zachowania? –

+10

Nie chodzi o to, że chcę złamać interfejs z niestandardowym zachowaniem. Po prostu nie rozumiem, dlaczego SDK oferuje sterowanie, aby push był animowany, ale nie ma takiej samej kontroli dla popu. Czuję, że to niespójne. –

+1

niestandardowe zachowanie powoduje, że rośniemy :) – Zac

Odpowiedz

3

Bardziej elegancki z kategorią. Zakłada to, że obiekt kontrolera nawigacyjnego jest ustawiony w delegacie aplikacji. Po prostu umieść to przed twoim @implementaion w kontrolerze widoku root.

#import "AppDelegate.h" 

@implementation UINavigationBar (custom) 
- (UINavigationItem *)popNavigationItemAnimated:(BOOL)animated; 
{ 

    AppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 

    [delegate.navController popViewControllerAnimated:NO]; 

    return TRUE; 
} 


@end 
+1

Dziękuję za odpowiedź, właśnie wypróbowałem to i to faktycznie działa, ale to jest zaskakujące, ponieważ zwracasz PRAWDA dla czegoś, czego oczekujesz UINavigationItem. –

+1

To rozwiązanie działa również, jeśli masz 1 i tylko 1 kontroler nawigacyjny w swojej aplikacji. Nie będzie działać z wieloma kontrolerami nawigacyjnymi. –

+0

to po prostu odbijanie się nad moją głową. Plz wyjaśnił. Jestem nowy bie. Thals –

2

Nie, że powinien jednak można zastąpić standardowe zachowanie poprzez tworzenie niestandardowych leftBarButtonItem w viewController.

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStylePlain target:self action:@selector(backButtonPressed)]; 
[[self navigationItem] setLeftBarButtonItem:item]; 
[item release]; 

- (void)backButtonPressed 
{ 
    [[self navigationContoller] popViewControllerAnimated:NO]; 
} 

documentation mówi, że należy przekazać jedynie NOprzed wyświetlany jest widok kontrolera NAV.

Należy pamiętać, że aplikacje niezgodne z wytycznymi interfejsu iPhone'a nie zostaną przyjęte do sklepu z aplikacjami.

+0

Ten kod jest błędny, a nawet wtedy działa tylko częściowo. Nie dostaniesz przycisku "strzałki". Typo w kodzie - brak "]" na linii 1. Twój kod w wierszu 2 jest niepoprawny - myślę, że powinien on brzmieć: "[self.navigationItem setLeftBarButtonItem: item];" w.r.t. "jest to do zaakceptowania przez Apple": 1. To nie jest prawda - wiele aplikacji, które naruszają HIG, jest akceptowanych; wiele własnych aplikacji Apple rażąco go narusza. 2. Za każdym razem, gdy chcesz wykonać niestandardową parę animacji push/pop, POTRZEBUJESZ wyłączenia tej domyślnej (ponieważ Apple nie udostępnia publicznego interfejsu API, aby ją przesłonić). – Adam

+0

Dzięki za odpowiedź. Niemniej jednak zgadzam się z Adamem: kształt "strzałki" jest konieczny w aplikacji na iPhone'a. –

+0

Zawsze można ponownie utworzyć obraz strzałki. Myślę, że jest to dość powszechna praktyka, ponieważ jabłko nie daje ci sposobu na programowe wykonanie. – livingtech

3

Doszedłem do SO poszukując bardziej eleganckiego rozwiązania, ale oto jak dotychczas (z powodzeniem) robiłem to do tej pory.

Podstawowa idea:

  1. NIE używać UINavigationController; zamiast korzystać z jego części składowych (np UINavigationBar) i zrobić samemu
  2. wywołać NavBar animować równolegle z własnymi niestandardowymi animacjami (lub nie, jeśli chcesz nie anim w ogóle)

wady:

  1. UINavigationController automatycznie wykonuje inne czynności, takie jak ładowanie/rozładowywanie pamięci. Ponadto jest on "zakodowany" we wszystkich kontrolerach UIView - mają one ZAWSZE odniesienia do kontrolera UINavigationController, który je zawiera. Szkoda wyrzucić to wszystko tylko dlatego, że Apple nie zapewnia haka do ustawiania niestandardowych animacji.

Code - w zależności od tego, klasa bierze odpowiedzialności za animację:

UINavigationItem *backItem = [[UINavigationItem alloc] initWithTitle:@"Back"]; 
[navigationController.navigationBar pushNavigationItem:backItem animated:TRUE]; 
// next line only needed if you want a custom back anim too 
navigationController.navigationBar.delegate = self; 

... jeśli chcesz wyciąć w zwyczaju z tyłu animacji, trzeba tę ostatnią linijkę wyżej, tak że można następnie słuchać paska nawigacyjnego i reagować równolegle, tak jak poniżej:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item 
{ 
    // trigger your custom back animation here 

    return TRUE; 
} 
+0

Dzięki za odpowiedź! Ale masz rację: jestem zbyt leniwy, aby wyrzucić wszystkie funkcje UINavigationController i wolę umożliwić animację;) –

+3

*** Kończenie aplikacji z powodu nieprzechwyconego wyjątku "NSInternalInconsistencyException", powód: "Nie można ręcznie ustawić delegować na UINavigationBar zarządzanym przez kontrolera. " –

+0

Przeczytaj ponownie krok 1 powyżej – Adam

3

Zapobiega domyślną animację.

- (void)viewWillDisappear:(BOOL)animated { 
    [UIView setAnimationsEnabled: NO]; 
} 

- (void)viewDidDisappear:(BOOL)animated { 
    [UIView setAnimationsEnabled: YES]; 
} 

W przypadku jeśli potrzebujesz niestandardowych animacji

- (void)viewWillDisappear:(BOOL)animated { 
    [UIView setAnimationsEnabled: NO]; 

    CATransition *transition = [CATransition animation]; 
    transition.duration = 0.3; 
    transition.type = kCATransitionFade; 
    [self.navigationController.view.layer addAnimation:transition forKey:kCATransition]; 
} 

- (void)viewDidDisappear:(BOOL)animated { 
    [UIView setAnimationsEnabled: YES]; 
} 
Powiązane problemy