1

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

我本质上想要一个没有任何渐变、纯色圆角极细阴影线的导航栏。我会在下面发布一张图片,但我至少需要 10 个声望点 :(

我开始使用以下代码来解决无渐变和纯色问题,并将其放在我的 rootviewcontroller 的 .m 文件中,然后放在类本身的 @implementation 之前,但无济于事:

@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;

对此事的任何帮助将不胜感激!

4

2 回答 2

1

如果您想以 iOS < 5 为目标,那么UIAppearance它对您没有帮助,因为它仅支持 iOS >= 5。

所以在我看来,使用png文件作为导航栏的背景更快,也许更安全。根据您想要的结果,您可以从代码中完成它并使其更快,只需创建一个BaseViewController将处理导航栏外观(背景、标题、按钮等)的,并且您的所有自定义视图控制器都可以从 this 继承BaseViewController,但是这个实现在有些情况可能有它自己的缺点,因为你不能从 iOS 中的多个类继承,我担心你会发现这一点有点晚,当你想要从一个不继承自BaseViewController.

另一方面,从代码创建颜色和图形可能会引起心爱的设计师的问题,他们想要左/上/右/下/对角线/等 1px,这样你会很头疼(发生在我身上) .

如果您的目标是 iOS >=5,那么UIAppearance就是您的朋友。

因此,总而言之,如果您的目标是 iOS >= 5,则使用UIAppearance如果不是,如果您的导航栏使用更复杂(渐变、线条、奇怪的颜色)UI png,如果导航栏使用简单(一种纯色)UI ,您可以从代码中毫无问题地做到这一点。

于 2013-07-15T17:54:59.327 回答
0

UINavigationBar 的外观代理可以为所有 UINavigationBars 设置默认值,如果您希望所有条都更改然后以编程方式进行,如果您只想更改 1 则在情节提要中进行,两种方法都应该具有相同的结果NavigationBar 的外观

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

如果您能够让图像具有圆角和烘焙阴影

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

这是一个简单的方法......更高级的方法是在情节提要中创建一个 UINavigationBar 项目,并带有关联的 IBOutlet,设置该项目的出口,从情节提要中设置所有属性,如背景图像,然后在viewDidLoad 方法将 UINavigationBar 的 IBOutlet 设置为您正在加载的 UIViewController 的 UINavigationController 的 UINavigationBar。此外,如果您愿意,您可以在此处绕过 UINavigationBar 的角落。

于 2013-07-15T17:09:29.880 回答