UINavigationBar 子视图隐藏了正确的 UIBarButtonItem
-
06-07-2019 - |
题
在根表视图控制器中,我添加一个包含图像的子视图:
[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];
我不明白为什么该按钮没有显示在导航栏中。如果我点击(空白区域)正确的操作:方法被调用,因此按钮“在那里”,预计它不会显示。
我尝试将 imageView 子视图发送回导航栏中,但无济于事。这是有道理的,因为按钮实际上属于 UINavigationItem 无论如何......
有人知道如何才能使该按钮正确显示吗?
更新:后退按钮确实显示正确,但它是由系统添加的......
解决方案
将图像添加到的更好方法 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”。
其他提示
我认为您应该将导航项的标题视图设置为imageView。
self.navigationItem.titleView = imageView;
我想 UINavigationBar
在子视图中显示 UINavigationItem
,并且您在该子视图之上添加了 UIImageView
。
在我的一个视图中,我正在显示标签和旁边的图像。我想我刚刚将标签和图像视图添加到一个视图中,然后我将其用于titleView。
不隶属于 StackOverflow