1

UINavigationBar をカスタマイズするには 2 つの異なる方法があることを知っています。背景画像をカスタム png に設定するか、バーの外観をプログラムでコードでカスタマイズできます。私の目的が iOS 4、5、6 をサポートすることである場合、コードを使用してバーの外観をカスタマイズすることは理にかなっていますか?

私は基本的に、グラデーションのないナビゲーション バー、無地の色丸みを帯びた角、および非常に細い影の線が必要です。以下に画像を投稿しますが、少なくとも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

また、このコードを実装して角を丸くしました。これは機能します。

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 では複数のクラスから継承できないため、場合によっては独自の欠点がある可能性があります。から継承しないView Controller BaseViewController

一方、コードから色とグラフィックスを作成すると、左/上/右/下/対角線などの 1 ピクセルを必要とする最愛のデザイナーから問題が発生する可能性があり、この方法では頭痛の種になります (私に起こりました)。 .

iOS >=5 をターゲットにしている場合UIAppearanceは、あなたの友達です。

結論として、iOS >= 5 をターゲットにしているUIAppearance場合は、そうでない場合に使用し、ナビゲーション バーの UI がより複雑な場合 (グラデーション、線、奇妙な色) を使用しpng、ナビゲーション バーの UI が単純な場合 (単色 1 つ) を使用します。 、コードから問題なく実行できます。

于 2013-07-15T17:54:59.327 に答える