自定义背景UINavigationBar的问题(Custom background for UINa

2019-07-18 05:18发布

我已经设法通过使用一个自定义背景添加到我的导航栏:

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

这工作得很好,我可以看到标题和按钮没关系。 然而,当我深入一层,然后返回到根,按钮是隐藏的,但标题仍然可见。 它出现在导航栏图像覆盖按钮项目。

我很困惑,我在底部插入它所以当导航项目入栈和出栈,他们都显示在上面的导航条等的意见我会承担。

有任何想法吗?

谢谢,

麦克风

Answer 1:

从下面的描述在这里 ,我建议增加一个类别的导航栏。

@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


Answer 2:

在iOS 5,这将无法工作,但好消息是,有这样做的简单方法

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

注意:这只能在iOS 5的工作,上述所以一定要检查的iOS版本,如果你想成为向后兼容。



Answer 3:

导航栏的子视图是不断变化的,我的意思是每个视图出现/消失,所以你不应该期望有加的ImageView子视图数组的索引0的。

你可以尝试在viewDidAppear添加这个(在每一个管理导航项目/ :)视图 - 控制:

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]);

我已经使用Hauek的解决方案,但在酒吧中其他控制器diferent的味道,它可以给一些小问题,反正,这既不是最好的选择。

希望它能帮助,至少要了解为什么你在做什么,不能正常工作,



Answer 4:

而不是做它的drawRect:在UINavigationBar的类别类方法你可以覆盖drawLayer:inContext的 。 里面的drawLayer:inContext的:方法,你能得到你想要使用的背景图片。 此外,如果您的应用支持多种接口方向可以选择纵向和横向界面方向不同的图像。

- (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);
}

这个完整的演示Xcode项目上定制UINavigationBar的外观也可能会有所帮助。



Answer 5:

你可以简单地添加新的背景你UINavigationBar的方式是下一个。

/////////
 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];


文章来源: Custom background for UINavigationBar problems