ソリッドカラーiOS 5のUINavigationBar

私はナビゲーションバーをカスタマイズするためにこのカテゴリを使用しています。私のコードは:

- (void) drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColor(context, CGColorGetComponents([self.tintColor CGColor]));
    CGContextFillRect(context, rect);
}

それはうまく動作しますが、iOS 5では動作しません。私はこれをどのようにするべきですか?

私が知っているように、iOS 5では drawRect メソッドを置き換える唯一の方法はサブクラスを作ることですが、すべてのナビゲーションコントローラが UINavigationBar 元のクラス?

3

3 答え

iOS 5では、UIAppearanceプロトコルを使用して、アプリケーション内のすべてのUINavigationBarsの外観を設定できます。参照:リンク

私がソリッドカラーを取得する方法は、ナビゲーションバーのカスタムイメージを作成し、これをUINavigationBarsバックグラウンドとして設定することでした。少なくともUINavigationBarと同じサイズのイメージを作成する必要があります。

あなたのアプリケーションデリゲートで、次のようなことをしてください:

UIImage *image = [UIImage imageNamed:@"navbarbg.png"];
[[UINavigationBar appearance] setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];

ヘッダーファイルに UIAppearanceContainer プロトコルを追加する必要もあります。

@interface AppDelegate : UIResponder 

@end

あなたは、画像の代わりに何か色や何かを設定することによって、おそらく同じことを達成することができます。しかし、私はこれが簡単な解決策であることを発見しました。

13
追加された
これは単色で動作するはずですか?それは動作するように見えません。
追加された 著者 iJK,
実際のイメージアセットを作成する代わりに、次のようにプログラムで作成することができます。 stackoverflow.com/a/1213816/883413
追加された 著者 Ric Santos,
このソリューションを使用すると、2ピクセルのオフセットが発生します。これは、画面の上部に非常に細い黒い線として表示されます。それをどうすれば解決できますか?さもなければこれは素晴らしい答えです。なぜなら、オーバーライドするナビゲーションバーに依存しないからです
追加された 著者 Hgeg,
うん。それが私の問題でした。画像の比率はnavbarのサイズとは異なります。助けてくれてありがとう。
追加された 著者 Hgeg,
「ソリッドカラー」はどういう意味ですか?少なくとも tintColor で動作します。 UIKitフレームワークのヘッダファイルでは、 UIAppearance プロトコルでサポートされているプロパティとメソッドを確認できます。サポートされているものは、行末に UI_APPEARANCE_PROTOCOL という文字が書かれています。例として UINavigationBar を取ってください:サポートされている6つのプロパティ/メソッドがあります。
追加された 著者 matsr,
@ Hgeg、それは奇妙に聞こえる..あなたは背景のためにイメージを使用していますか?イメージがナビゲーションバーと同じサイズであることを確認します。
追加された 著者 matsr,

これは、iOS 5とiOS 4.3以前の両方を対象としています

https://gist.github.com/1774444

1
追加された

これは、より多くのハックであり、一貫して私のために働いています。 これはAppDelegateファイルにある必要があります。

//Create  a size struct.
CGSize size = CGSizeMake(768, 50);

//CReate a imagecontext from a non-existing image. You can use a existing image as well, in that case the color will be the color of the image. 
UIImage *backgroundImage = [UIImage imageNamed:@"nonexist.png"];

UIGraphicsBeginImageContext(size);

[backgroundImage drawInRect:CGRectMake(0,0,size.width,size.height)];

UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

self.navigationController = [[UINavigationController alloc]initWithRootViewController:self.viewController];

背景色を選択した色に設定します。

[self.navigationController.view setBackgroundColor:[UIColor blackColor]];

self.window.rootViewController = navigationController;
[self.window makeKeyAndVisible];

//Most important line.
[navigationController.navigationBar setBackgroundImage: newImage forBarMetrics:UIBarMetricsDefault];
0
追加された