Frage

Ich habe es geschafft, einen eigenen Hintergrund zu meiner Navigationsleiste hinzufügen, indem Sie mit:

UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"UINavigationBar.png"]];
[myViewController.navigationBar insertSubview:iv atIndex:0];
[iv release];

Das funktioniert gut, und ich kann der Titel und Tasten in Ordnung sehen. Allerdings, wenn ich eine Ebene Drill-Down und dann an die Wurzel zurückgehen, sind die Tasten versteckt, aber der Titel ist noch sichtbar. Es erscheint in der Navigationsleiste Bild der Taste, um Elemente abdeckt.

Ich bin verwirrt, wie ich es am Boden bin Einfügen so dass ich annehmen würde, wenn die Navigationselemente geschoben und knallten, dass sie über andere Ansichten in der Navigationsleiste angezeigt werden.

Irgendwelche Ideen?

Danke,

Mike

War es hilfreich?

Lösung

Nach der Beschreibung von hier , schlage ich vor, das Hinzufügen einer Kategorie in die Navigationsleiste.

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
    // Drawing code 
    UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);

}
@end

Andere Tipps

Auf iOS 5 wird dies nicht funktionieren, aber die gute Nachricht ist, dass es eine einfache Möglichkeit, dies zu tun,

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"name"] forBarMetrics:UIBarMetricsDefault];

Hinweis: Dies funktioniert nur auf iOS 5 arbeiten und oben, so stellen Sie sicher, dass iOS-Version überprüfen, ob Sie rückwärtskompatibel sein wollen

.

navigationbar der Subviews ständig ändern, ich meine jede Ansicht erscheinen / verschwinden, so dass Sie sollten nicht erwarten, den zusätzlichen Imageview am Index 0 des Subviews Array haben.

Sie könnten versuchen, dies zu viewDidAppear hinzuzufügen (in jedem Viewcontroller, die Navigationselemente verwalten /:):

NSLog(@"navbar's subviews before \n %@",[[[self navigationController] navigationBar] subviews]);

for (UIImageView *imgv in [[[self navigationController] navigationBar] subviews]) {
    [[[self navigationController] navigationBar] sendSubviewToBack:imgv];
}

NSLog(@"navbar's subviews after \n %@",[[[self navigationController] navigationBar] subviews]);

Ich habe verwendet Hauek der Lösung, aber wenn die Bar Geschmack in anderen Controllern diferent hat, könnte es einige kleinere Probleme geben, wie auch immer, dies ist weder die beste Option.

Hoffe, dass es helfen, zumindest zu verstehen, warum das, was Sie taten, war nicht funktioniert,

Statt es in drawRect tun: können Sie überschreiben die drawLayer: InContext: Methode in einer UINavigationBar Kategorie Klasse. Innerhalb des drawLayer: InContext: Methode können Sie das Hintergrundbild Sie verwenden möchten zeichnen. Sie können auch verschiedene Bilder für Hoch- und Querschnittstellen Ausrichtungen wählen, ob Ihre App mehr Interface-Orientierungen unterstützt.

- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
    if ([self isMemberOfClass:[UINavigationBar class]] == NO) {
        return;
    }

    UIImage *image = (self.frame.size.width > 320) ?
                        [UINavigationBar bgImageLandscape] : [UINavigationBar bgImagePortrait];
    CGContextClip(context);
    CGContextTranslateCTM(context, 0, image.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
}

Dieses komplette Demo Xcode-Projekt auf das Auftreten von UINavigationBar Customizing auch hilfreich sein könnte.

Wie Sie einen neuen Hintergrund zu Ihrem UINavigationBar einfach hinzufügen können, ist die nächste.

/////////
 UINavigationController *navController = [[UINavigationController alloc] init];
 UINavigationBar*bar=[navController navigationBar]; // get navigation bar 
  NSArray*barSubview=[bar subviews]; // get all subviews of bar
 UIView*backView=[arr objectAtIndex:0]; // at index 0 lying background view of our bar
 backView.alpha=0.0f;// set alpha to 0 and it will become invisible

    UIImageView*imgView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"top-bar.png"]];// create the image view that we will insers as subbview in our bar
    imgView.frame=CGRectMake(0, 0, 320, 44);
    [bar insertSubview:imgView atIndex:0];// and it will be out new background
    [imgView release];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top