我知道有两种不同的方法可以自定义UINavigationBar:您可以将背景图像设置为某个自定义png,也可以通过编程方式自定义条形图在代码中的外观。如果我的目标是支持iOS 4,5,6,尝试通过代码自定义条的外观是否有意义?
我基本上想要一个导航栏没有任何渐变,一个纯色,圆角,一个极薄的阴影线< / strong>即可。我会在下面发布一张图片,但我需要至少10个声望点:(
我已经开始使用以下代码来解决无渐变和纯色问题,并且在类本身的@implementation之前我将它放在我的rootviewcontroller的.m文件中,但无济于事:< / p>
@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawRect:(CGRect)rect {
UIColor *color = [UIColor blueColor];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColor(context, CGColorGetComponents( [color CGColor]));
CGContextFillRect(context, rect);
}
@end
我也已经实现了这个代码来完善角落,工作:
CALayer *capa = [self.navigationController navigationBar].layer;
[capa setShadowColor: [[UIColor blackColor] CGColor]];
[capa setShadowOpacity:0.85f];
[capa setShadowOffset: CGSizeMake(0.0f, 1.5f)];
[capa setShadowRadius:2.0f];
[capa setShouldRasterize:YES];
//Round
CGRect bounds = capa.bounds;
bounds.size.height += 10.0f; //I'm reserving enough room for the shadow
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:bounds
byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight)
cornerRadii:CGSizeMake(10.0, 10.0)];
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = bounds;
maskLayer.path = maskPath.CGPath;
[capa addSublayer:maskLayer];
capa.mask = maskLayer;
非常感谢任何有关此事的帮助!
答案 0 :(得分:1)
如果您想定位iOS&lt; 5然后UIAppearance
将无法帮助您,因为仅支持iOS&gt; = 5。
所以在我看来,使用png
文件导航栏的背景更快,也许更安全。根据您所需的结果,您可以从代码中执行此操作并使其更快,只需创建一个BaseViewController
来处理导航栏的外观(背景,标题,按钮等),并且所有自定义视图控制器都可以从此继承BaseViewController
,但是这种实现在某些情况下会有它自身的缺点,因为你不能从iOS中的多个类继承,而且我担心你会发现这有点迟到了当您希望从视图控制器获取不从BaseViewController
继承的功能时。
另一方面,从代码创建颜色和图形可能会引起心爱的设计师的问题,他们需要1px左/上/右/下/对角线等等,这样你就会头疼(发生这种情况)对我来说。
如果您的目标是iOS&gt; = 5,那么UIAppearance
就是您的朋友。
总而言之,如果您要定位iOS&gt; = 5,请使用UIAppearance
否则,如果您的导航栏使用png
更复杂(渐变,线条,奇怪颜色)UI ,如果你有简单的(一个平面颜色)导航栏UI,你可以从代码中做到这一点没有问题。
答案 1 :(得分:0)
UINavigationBar的外观代理是设置所有UINavigationBars的默认值,如果你想要改变所有的条形,然后以编程方式进行,如果你只需要改变1,那么在故事板中这两个方法应该有导航栏外观的结果相同
颜色/阴影应该在图像中,但请注意不要更改导航栏的高度......
如果您能够让图像具有圆角并且阴影在
中烘焙如果您不是,则必须使用上面的代码在代码中执行此操作
这是一个简单的方法......一个更高级的方法是在故事板中创建一个UINavigationBar项目,其中包含一个关联的IBOutlet,设置该项目的出口,在故事板中设置所有属性,如背景图像,然后在viewDidLoad方法中将UINavigationBar的IBOutlet设置为您正在加载的UIViewController的UINavigationController的UINavigationBar。此外,如果您愿意,可以在这里围绕UINavigationBar的角落。