4 Stimmen

Übergang von UINavigationBar Farben?

Ich versuche im Grunde, das Verhalten der iPod-App auf dem iPhone zu duplizieren, wo bei der Auswahl eines Titels die Musik-Player-Ansicht eingeblendet wird und die Navigationsleiste zu einer neuen Farbe wechselt.

Meine Anwendung ist als eine auf Registerkarten basierende Anwendung eingerichtet, mit UITabBarController und eine verschachtelte UINavigationController in jeder Registerkarte. Innerhalb jeder UINavigationController für jede Registerkarte ist eine UITableView. Wenn ich ein Element in der Tabelle auswähle, verwende ich pushViewController um zur nächsten Ansicht zu wechseln, und ich habe die hidesBottomBarWhenPushed im nächsten View-Controller, um die Tabs wegzuschieben. Das Verhalten kommt der iPod-Seite "Now Playing" sehr nahe, die nahezu perfekt ist.

Das letzte Problem ist, dass ich nicht in der Lage bin, die Farbe der Navigationsleiste zu ändern, so wie die Navigationsleiste in der iPod-App von Blau zu Schwarz wechselt. Ich bin in der Lage, den Farbwechsel zu erzwingen, nachdem die neue Ansicht erscheint (in viewWillAppear ), aber der Wechsel ist abrupt und entspricht nicht dem Verhalten der iPod-App, die einen Fade-Effekt aufweist.

Weiß jemand, was ich hier übersehe? Es scheint, wie eine sehr einfache und gemeinsame UI, die ich in mehreren Anwendungen gesehen habe, aber es scheint nicht eine offensichtliche Möglichkeit, es zu tun sein.

8voto

Hilton Campbell Punkte 6025

Die Antwort von Andrew funktioniert eigentlich ganz gut, aber ich würde noch zwei Dinge hinzufügen, damit sie besser funktioniert:

  1. Bieten Sie die Funktionalität über eine Kategorie an, anstatt eine Unterklasse zu bilden. Viel, viel weniger chaotisch.
  2. Verwenden Sie den Übergang nur, wenn es unbedingt notwendig ist. Der Grund dafür ist, dass bei dieser Technik der ursprüngliche Titeltext einfach ausgeblendet wird, anstatt an der Seite zu verschwinden. Das ist zwar subtil, aber viel auffälliger, wenn es während eines Übergangs passiert, bei dem sich der Balkenstil nicht wirklich ändert. Deshalb vermeide ich diesen Fall.

Hier ist meine Kategorie-Code (ich habe es in Kategorien von UINavigationBar und UIToolbar):

- (void)setBarStyle:(UIBarStyle)barStyle animated:(BOOL)animated {
    if (animated && self.barStyle != barStyle) {
        CATransition *transition = [CATransition animation];
        transition.duration = 0.2;
        transition.timingFunction = [CAMediaTimingFunction
            functionWithName:kCAMediaTimingFunctionEaseIn];
        [self.layer addAnimation:transition forKey:nil];
    }

    [self setBarStyle:barStyle];
}

Und so verwende ich es:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [[UIApplication sharedApplication]
        setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];
    [self.navigationController.navigationBar
        setBarStyle:UIBarStyleBlackTranslucent animated:YES];
    [self.navigationController.toolbar
        setBarStyle:UIBarStyleBlackTranslucent animated:YES];
}

3voto

Matt Stevens Punkte 12783

Sie können den Stilwechsel der Statusleiste animieren, um einen ziemlich ähnlichen Effekt zu erzielen.

- (void)viewWillAppear:(BOOL)animated {
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:animated];
    self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
}

Wie Sie bemerkt haben, ändert sich der Stil der Navigationsleiste sofort, aber die animierte Änderung der Statusleiste sorgt immer noch für den Gesamteindruck eines Übergangs.

2voto

Andrew Pouliot Punkte 5423

Ich habe eine Lösung gekocht, die vielleicht eher das ist, wonach Sie suchen.

  • Erstellen Sie eine benutzerdefinierte Unterklasse von UINavigationBar .
  • Überschreiben Sie setBarStyle: wie folgt

Code:

- (void)setBarStyle:(UIBarStyle)style {
    //Fade our content, ie background, from one style to another
    CATransition *transition = [[CATransition new] autorelease];
    transition.type = kCATransitionFade;
    transition.duration = 0.2;
    [self.layer addAnimation:transition forKey:@"content"];

    [super setBarStyle:style];
}
  • Konfigurieren Sie Ihre Nav-Controller so, dass sie diese Unterklasse verwenden
    • In IB können Sie die Klasse einfach im Inspektor einstellen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X