2010-07-14 12 views
16

Ich habe eine iPhone-Anwendung mit UINavigationController und möchte die Elemente mit benutzerdefinierten Hintergrundbildern anpassen. Ich konnte dies leicht Objective-C Kategorien unter Verwendung UINavigationBar recht für die UINavigationController's tun:Benutzerdefinierte UINavigationController UIToolbar Hintergrundbild

http://foobarpig.com/iphone/uinavigationbar-with-solid-color-or-image-background.html

Ich mag würde das gleiche für die UINavigationController'sUIToolbar zu tun, aber der gleiche Ansatz scheint nicht zu arbeiten (obwohl ich absolut keine Ahnung habe, warum nicht.) Ich habe mich umgesehen und Leute scheinen Unterklasse UIToolbar vorschlagen, aber das ist nicht möglich für die UINavigationController's Symbolleiste, die eine schreibgeschützte UIToolbar ist. Ich möchte die Symbolleiste UINavigationController's verwenden, anstatt nur eine Unteransichts-Symbolleiste zu erstellen, da ich die animierte Animation setToolbarHidden verwende.

Jeder hat eine Idee, wenn es möglich ist, ein Hintergrundbild auf diese UINavigationController Werkzeugleiste (am wahrscheinlichsten durch Überschreiben der drawRect Methode) anwenden?

Antwort

9

Sie müssen eine Unterklasse erstellen, anstatt eine Kategorie zu erstellen.

Ich bin mir nicht sicher, warum eine Kategorie funktioniert für UINavigationBar, aber nicht UIToolbar, aber Unterklassen funktioniert für beide und ich denke, es ist die Standard-Art der Anpassung solcher Sachen.

So UIToolbar Unterklasse, erstellen Sie eine Klasse MyToolbar (oder so ähnlich) und setzen diese in der .h genannt:

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 

@interface MyToolbar : UIToolbar {} 

- (void)drawRect:(CGRect)rect; 

@end 

Und dies in der der .m-Datei:

#import "MyToolbar.h" 

@implementation MyToolbar 

- (void)drawRect:(CGRect)rect { 
    backgroundImage = [UIImage imageNamed:@"my-awesome-toolbar-image.png"]; 
    [backgroundImage drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
} 

@end 

Von dort müssen Sie dem Navigationscontroller sagen, dass er MyToolbar statt UIToolbar verwenden soll. Der einfachste Weg, den ich gefunden habe, besteht darin, den Navigations-Controller im Interface Builder auszuwählen und dann im Bereich "Attribute" das Kontrollkästchen "Symbolleiste anzeigen" zu aktivieren. Die Symbolleiste sollte im Fenster NavigationController angezeigt werden. Klicken Sie darauf und ändern Sie im Identity Inspector die Klasse in MyToolbar.

+3

Großartig! Vielen Dank. Kennst du (oder jemand anders) einen Weg, den letzten Schritt programmatisch zu machen? Ich habe meinen Navigationscontroller nicht mit Interface Builder eingerichtet. – Chris

+2

@Chris, würde ich auch gerne wissen, wie Sie die Symbolleiste programmgesteuert überschreiben. Vielen Dank! – pixelfreak

+1

Wer hat gefunden, wie der letzte Schritt programmgesteuert durchgeführt werden kann? – Panos

10

Update:

In iOS 5.0+ Sie können nun UIAppearance verwenden, um die Navigationsleiste anpassen.


Ein anderer Weg, dies zu tun, ist einfach UINavigationBar Klasse eine Kategorie für Ihre Anwendung zu erstellen. Das war ziemlich einfach zu implementieren:

Schnittstelle:

@interface UINavigationBar (TENavigationBar) 

- (void) drawRect:(CGRect)rect; 

@end 

Umsetzung:

@implementation UINavigationBar (TENavigationBar) 

- (void) drawRect:(CGRect)rect 
{ 
    UIImage *image = [UIImage imageNamed:@"navigation_background"]; 

    [image drawInRect:CGRectMake(0, 
           0, 
           self.frame.size.width, 
           self.frame.size.height)]; 
} 

@end 

Dann wird diese global auf alle Ihre UINavigationBar ‚s automatisch angewendet werden.

+1

Leider passt dies die Navigationsleiste und nicht die Symbolleiste. –

+0

Wow, guter Punkt. Ich habe die Markierung hier völlig verfehlt. Trotzdem eine gute Lösung für die Navigationsleiste :) – Maurizio

+0

Ich habe meinem Code zwei Dateien hinzugefügt, UINavigationBar.h und UINavigationBar.m und habe diesen Code hinzugefügt. Ich versuchte auch mit den Dateinamen JHNavigationBar.h/.m. Es wurde nicht automatisch für mich angewendet. Was vermisse ich? – joshholat

2

Eine der besten Lösungen ist das Erstellen einer Kategorie von UINavigationBar und UIToolbar. Die nächsten Klassen gibt Ihnen eine Lösung für iOS 4.0 und iOS 5.0 Kompatibilität:

Das einzige, was ist es, Ihnen die nächsten Methoden in Ihrem viewDidLoad zum Beispiel anrufen müssen:

// Customizacion de navigation bar y toolbar compatible con iOS4 e iOS5 
[UINavigationBar iOS5UINavigationBarBackgroundImage]; 
[UIToolbar iOS5UIToolbarBackgroundImage];  

die Klasse Kategorie für iOS Also, 4.0 und iOS 5.0 Kompatibilität für anpassen Hintergrundbild Ergebnisse wie folgt:

@implementation UINavigationBar (BackgroundImage) 
- (void)drawRect:(CGRect)rect 
{  
    UIImage* img = [UIImage imageNamed: @"navigation-bg.png"]; 
    [img drawInRect: CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
    [self setTintColor:UIColorFromRGB(0x5ca666)];  
} 
+ (void) iOS5UINavigationBarBackgroundImage 
{ 
    if ([UINavigationBar respondsToSelector: @selector(appearance)]) 
    { 
     [[UINavigationBar appearance] setBackgroundImage: [UIImage imageNamed: @"navigation-bg.png"] forBarMetrics: UIBarMetricsDefault]; 
     [[UINavigationBar appearance] setTintColor:UIColorFromRGB(0x5ca666)]; 
    } 
} 
@end 

@implementation UIToolbar (BackgroundImage) 
- (void)drawRect:(CGRect)rect 
{ 
    UIImage *image = [UIImage imageNamed: @"toolbar-bg.png"]; 
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
    [self setTintColor:UIColorFromRGB(0x5ca666)]; 
} 
+ (void) iOS5UIToolbarBackgroundImage 
{ 
    if ([UIToolbar respondsToSelector: @selector(appearance)]) 
    { 
     [[UIToolbar appearance] setBackgroundImage:[UIImage imageNamed: @"toolbar-bg.png"] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault]; 
     [[UIToolbar appearance] setTintColor:UIColorFromRGB(0x5ca666)]; 
    } 
} 
@end 

Greets!

0

Eine einfache Möglichkeit ist UINavigationBar/UIToolbar und initialisieren Sie den Navigation-Controller mit der Methode zu Unterklasse:

- (instancetype)initWithNavigationBarClass:(Class)navigationBarClass toolbarClass:(Class)toolbarClass

jedoch für einfache Anpassungen (als Hintergrundbilder, Schatten, etc.) Ich würde empfehlen Verwenden Sie das UIAppearance Protokollmuster.

Verwandte Themen