2010-02-14 5 views
11

Mögliche Duplizieren:
How to add background image on iphone Navigation bar?iPhone - navigationbar kundenspezifische Hintergrund

ich nach einem Weg suchen eine benutzerdefinierte Navigationsleiste und eine benutzerdefinierte Navigationsleiste Hintergrund haben müssen, dies zu erreichen . Ich habe mich nach dem Weg umgesehen, konnte aber keine Lösung finden. Wenn jemand die Lösung hat, wird Hilfe sehr geschätzt.

+0

Es gibt mehr Lösungen alternative Lösungen hier: http://stackoverflow.com/questions/1692487/how-to-add-background-image-on-iphone-navigation-bar –

Antwort

6

Sie können der novaigationBar nur eine Unteransicht (eine UIImageView) hinzufügen, die nur eine UIView-Unterklasse ist.

UINavigationBar nb = [[UINavigationBar alloc]init]; 
[nb addSubview: foo]; 
[nb release]; 

Hier ist ein Forum Post, die beschreibt, wie diese in eine Kategorie einpacken: http://discussions.apple.com/thread.jspa?threadID=1649012&tstart=0

10

(ergänzende Antwort auf Andrew Johnson)

Die verknüpfte Apple.com Post beinhaltet 3 oder 4 verschiedene Lösungen von denen die meisten nur "halb" arbeiten. Ich denke, die eleganteste/effektiv von ihnen ist diese:

@implementation UINavigationBar (CustomImage) 
- (void)drawRect:(CGRect)rect { 
    UIImage *image = [UIImage imageNamed: @"NavigationBar.png"]; 
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
} 
@end 

JEDOCH ... es ist nicht gut Praxis ObjC dass als Kategorie od (sollte eine Überschreibung sein), und es hat einige Probleme seiner besitzen.

Also, eine allgemeinere und leistungsfähige Lösung ist hier:

http://samsoff.es/posts/customize-uikit-with-method-swizzling

+0

Dank für die Verknüpfung Adam :) Du hast Recht, dass das Überschreiben von Methoden mit Kategorien eine sehr schlechte Übung ist. –

+0

Jemand hat das ohne Erklärung abgelehnt? Nicht sicher warum. Obwohl ich hinzufügen würde: Diese ganze Frage (und die meisten Antworten) sind nur iOS 2/3/4 - iOS 5 hat ein ganz neues System, um dies zu tun. Die Antwort funktioniert immer noch für die Leute, die iOS4 machen. – Adam

14

Seit iOS5, Sie ganz einfach einen benutzerdefinierten Hintergrund festlegen können, mit dem Verfahren setBackgroundImage: forBarMetrics: Aber Sie müssen überprüfen, ob Das Telefon des Benutzers hat das richtige Betriebssystem.

if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) 
{ 
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"texture.png"] 
                forBarMetrics:UIBarMetricsDefault]; 
} 

Dies ist eine bessere Lösung, weil es in der Doc ist.

+0

Bis ein Benutzer, der nicht iOS5 ausführt, Ihre App ausführt – JoeCortopassi

+3

Ja, aber es gibt einen Haken dafür. Sie können etwas anderes in der else-Klausel machen. – Martin

3

Kopieren Sie dies in viewDidLoad. Es wird nach iOS 5 suchen und die bevorzugte Methode verwenden, andernfalls wird eine Unteransicht zur navBar für iOS-Versionen < 5.0 hinzugefügt. Dies funktioniert, vorausgesetzt Ihr benutzerdefiniertes Hintergrundbild enthält keine Transparenzen.

float version = [[[UIDevice currentDevice] systemVersion] floatValue]; 
NSLog(@"%f",version); 
UIImage *backgroundImage = [UIImage imageNamed:@"myBackgroundImage.png"]; 
if (version >= 5.0) { 
    [self.navigationController.navigationBar setBackgroundImage:backgroundImage forBarMetrics:UIBarMetricsDefault]; 
} 
else 
{ 
    [self.navigationController.navigationBar insertSubview:[[[UIImageView alloc] initWithImage:backgroundImage] autorelease] atIndex:1]; 
}