【问题标题】:UINavigationBar subview is hiding the right UIBarButtonItemUINavigationBar 子视图隐藏了正确的 UIBarButtonItem
【发布时间】:2009-10-28 02:22:08
【问题描述】:

在根表视图控制器中,我添加了一个包含图像的子视图:

[self.navigationController.navigationBar addSubview:imageView];

然后在我推入堆栈的子表视图控制器中,我设置了一个正确的 UIBarButtonItem:

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Right"  style:UIBarButtonItemStylePlain target:self action:@selector(rightAction:)];
self.navigationItem.rightBarButtonItem = rightButton;
[rightButton release];

我不明白为什么按钮没有显示在导航栏中。如果我点击(空白区域),则会调用 rightAction: 方法,因此按钮“在”那里,预计它不会显示。

我尝试将 imageView 子视图发送回导航栏中,但无济于事。这是有道理的,因为按钮实际上属于 UINavigationItem 反正......

有人知道我怎样才能让那个按钮正确显示吗?

更新:后退按钮确实显示正确,但它是由系统添加的...

【问题讨论】:

    标签: iphone uinavigationcontroller uinavigationbar uinavigationitem


    【解决方案1】:

    将图像添加到UINavigationBar 的更好方法是对其进行子类化或创建类别并覆盖drawRect 方法:

    //                                  #Lighter r,g,b,a            #Darker r,g,b,a
    #define MAIN_COLOR_COMPONENTS       { 0.153, 0.306, 0.553, 1.0, 0.122, 0.247, 0.482, 1.0 }
    #define LIGHT_COLOR_COMPONENTS      { 0.478, 0.573, 0.725, 1.0, 0.216, 0.357, 0.584, 1.0 }
    
    @implementation UINavigationBar (UINavigationBarCategory)
    
    - (void)drawRect:(CGRect)rect {
        if (imageReady) {
            UIImage *img = [UIImage imageNamed: @"navigation_background.png"];
            [img drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
        } else {
            // Render yourself instead.
            // You will need to adjust the MAIN_COLOR_COMPONENTS and LIGHT_COLOR_COMPONENTS to match your app
    
           // emulate the tint colored bar
           CGContextRef context = UIGraphicsGetCurrentContext();
           CGFloat locations[2] = { 0.0, 1.0 };
           CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
    
           CGFloat topComponents[8] = LIGHT_COLOR_COMPONENTS;
           CGGradientRef topGradient = CGGradientCreateWithColorComponents(myColorspace, topComponents, locations, 2);
           CGContextDrawLinearGradient(context, topGradient, CGPointMake(0, 0), CGPointMake(0,self.frame.size.height/2), 0);
           CGGradientRelease(topGradient);
    
           CGFloat botComponents[8] = MAIN_COLOR_COMPONENTS;
           CGGradientRef botGradient = CGGradientCreateWithColorComponents(myColorspace, botComponents, locations, 2);
           CGContextDrawLinearGradient(context, botGradient,
           CGPointMake(0,self.frame.size.height/2), CGPointMake(0, self.frame.size.height), 0);
           CGGradientRelease(botGradient);
    
           CGColorSpaceRelease(myColorspace);
    
    
           // top Line
           CGContextSetRGBStrokeColor(context, 1, 1, 1, 1.0);
           CGContextMoveToPoint(context, 0, 0);
           CGContextAddLineToPoint(context, self.frame.size.width, 0);
           CGContextStrokePath(context);
    
           // bottom line
           CGContextSetRGBStrokeColor(context, 0, 0, 0, 1.0);
           CGContextMoveToPoint(context, 0, self.frame.size.height);
           CGContextAddLineToPoint(context, self.frame.size.width, self.frame.size.height);
           CGContextStrokePath(context);
        }
    }
    
    @end
    

    这样做会导致您的按钮正确显示并且不那么“hacky”。​​

    【讨论】:

    • 我可以继承 UINavigationBar 但该属性在 UINavigationController 中是只读的...另一件事是“图像”实际上是从服务器检索的,因此必须动态设置.
    • 我已接受您的回答,但我非常感谢您提供以下内容:如果我的图像在显示导航栏时尚未准备好,我会得到黑色背景。我可以在不使用图像的情况下恢复到默认的蓝色背景/样式的任何更改?
    • @coneybeare hai 我有同样的问题我使用了你的代码 sn-p 仍然是同样的问题你能帮我吗
    • @balu,这在 iOS 5 中不再适用,除非您使用子类。
    【解决方案2】:

    我认为您应该将导航项的标题视图设置为您的 imageView。

    self.navigationItem.titleView = imageView;
    

    我猜UINavigationBar 在子视图中显示UINavigationItems,而您将UIImageView 添加到该子视图之上。

    在我的一个视图中,我在它旁边显示了一个标签和一个图像。我想我只是将标签和图像视图添加到一个视图中,然后将其用于 titleView。

    【讨论】:

    • 这通常可以工作,但 titleView 不会跨越整个屏幕。我怀疑它只有 300px 而不是 320。
    • 我猜你想要它作为背景图片呢?好的,那么也许尝试在索引 0 处添加您的 imageView (-insertSubview:atIndex:)
    猜你喜欢
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 2013-02-17
    • 2017-10-30
    相关资源
    最近更新 更多