最好用图像或编程自定义UINavigationBar?

时间:2013-07-15 16:43:30

标签: iphone ios objective-c uinavigationbar

我知道有两种不同的方法可以自定义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;

非常感谢任何有关此事的帮助!

2 个答案:

答案 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的角落。