我知道有两种不同的方法可以自定义UINavigationBar:您可以将背景图像设置为某个自定义png,也可以通过编程方式自定义条形图在代码中的外观 . 如果我的目标是支持iOS 4,5,6,尝试通过代码自定义栏的外观是否有意义?
我基本上想要一个导航栏 without any gradience , a solid color , rounded corners 和 an extremely thin shadow line . 我会在下面发布一张图片,但我需要至少10个声望点:(
我已经开始使用以下代码来解决没有渐变和纯色问题的问题,并且在类本身的@implementation之前我已将它放在我的rootviewcontroller的.m文件中,但无济于事:
@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawRect:(CGRect)rect {
UIColor *color = [UIColor blueColor];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColor(context, CGColorGetComponents( [color CGColor]));
CGContextFillRect(context, rect);
}
@end
我也已经实现了这个代码来完善角落, works :
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 回答
如果你想要iOS <5,那么
UIAppearance
将无法帮助你,因为它仅支持iOS> = 5 .所以在我看来,使用
png
文件作为导航栏的背景更快,也许更安全 . 根据您所需的结果,您可以从代码中进行操作并使其更快,只需创建一个BaseViewController
来处理导航栏的外观(背景, Headers ,按钮等),并且所有自定义视图控制器都可以从此BaseViewController
继承,但这样在某些情况下,实现可以从iOS继承多个类,并且'm afraid that you will find out this a little bit late when you will get to a point when you will want to have features from a view controller that doesn't继承自BaseViewController
.另一方面,从代码创建颜色和图形可能会引起心爱的设计师的问题,他们需要1px左/上/右/下/对角线/等等,这样你就会头疼(碰巧发生在我身上) .
如果你的目标是iOS> = 5,那么
UIAppearance
就是你的朋友 .总而言之,如果您的目标是iOS> = 5,请使用
UIAppearance
,如果您有更复杂的(渐变,线条,奇怪的颜色)导航栏的UI使用png
,如果您有简单的(一个平面颜色)UI导航栏,你可以从代码中做到没有问题 .UINavigationBar的外观代理是设置所有UINavigationBars的默认值,如果你想要更改所有条形图然后以编程方式进行操作,如果你只需要改变1然后在故事板中这样做,两个方法应该具有相同的结果您的NavigationBar的外观
颜色/阴影应该在图像中,但请注意不要更改导航栏的高度...
如果你能够让图像有圆角和阴影烘烤
如果您不是,则必须使用上面的代码在代码中执行此操作
这是一个简单的方法...更高级的方法是在故事板中创建一个UINavigationBar项目,其中包含一个关联的IBOutlet,设置该项目的出口,在故事板中设置所有属性,如背景图像,然后在viewDidLoad方法将UINavigationBar的IBOutlet设置为您正在加载的UIViewController的UINavigationController的UINavigationBar . 此外,如果您愿意,可以在这里围绕UINavigationBar的角落 .