首页 文章

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

提问于
浏览
1

我知道有两种不同的方法可以自定义UINavigationBar:您可以将背景图像设置为某个自定义png,也可以通过编程方式自定义条形图在代码中的外观 . 如果我的目标是支持iOS 4,5,6,尝试通过代码自定义栏的外观是否有意义?

我基本上想要一个导航栏 without any gradiencea solid colorrounded cornersan 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 回答

  • 0

    如果你想要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导航栏,你可以从代码中做到没有问题 .

  • 1

    UINavigationBar的外观代理是设置所有UINavigationBars的默认值,如果你想要更改所有条形图然后以编程方式进行操作,如果你只需要改变1然后在故事板中这样做,两个方法应该具有相同的结果您的NavigationBar的外观

    颜色/阴影应该在图像中,但请注意不要更改导航栏的高度...

    如果你能够让图像有圆角和阴影烘烤

    如果您不是,则必须使用上面的代码在代码中执行此操作

    这是一个简单的方法...更高级的方法是在故事板中创建一个UINavigationBar项目,其中包含一个关联的IBOutlet,设置该项目的出口,在故事板中设置所有属性,如背景图像,然后在viewDidLoad方法将UINavigationBar的IBOutlet设置为您正在加载的UIViewController的UINavigationController的UINavigationBar . 此外,如果您愿意,可以在这里围绕UINavigationBar的角落 .

相关问题