2

ストーリーボードでアプリを構築しています。今、アプリのすべての画面に同じトップバー/ナビゲーションバーが必要です。このナビゲーションバーに画像を設定したい。いくつか検索した後、このコードを見つけました。

@implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect
{
    UIImage *image = [UIImage imageNamed: @"topbar.jpg"];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end  

appdelagate.M ファイルの実装のすぐ上に配置しました。しかし、それは機能していません。また、これが IOS 5.1 でも機能しているかどうかを知っている人はいますか?

敬具。

4

2 に答える 2

4

を見てくださいUIAppearance。UI クラス全体で属性を変更できます。たとえば、私はアプリにこれを持っています:

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

UIAppearanceは iOS 5 で導入されました。これを行う「古い」方法は-drawRect:、問題のクラスのカテゴリ (例: UINavigationBar) を使用してオーバーライドすることでした。(「スウィズリング」-SDK が提供するメソッドとメソッドを交換する-ちなみに、必須ではありません。)

iOS5 が出てきたとき、このdrawRectトリックが機能しないことがわかったのでUIAppearance、上記のコードをif次のようにステートメントで囲んで、条件付きで使用する必要がありました。

if ([[UINavigationBar class] respondsToSelector:@selector(appearance)]) {
    ...
}

なぜ条件付き?iOS4 のサポートは継続しているため、条件を設定しないと iOS4 ユーザーがクラッシュする可能性がありますUIAppearancedrawRectそして、アプリにはこれとソリューションの両方がありました!

iOS4 をサポートする必要がない場合は、UIAppearanceここで目的を達成するために検討する必要があります。

于 2012-10-18T20:47:31.597 に答える
0

+initialize私はこの目的のためにdrawRectをスウィズルしていましたが、method_exchangeImplementations(runtime.h)でスウィズリングを実行できます。ここで注意が必要なのは、元のdrawRectを呼び出すことです。メソッドがスウィズルされるため、カスタムの描画メソッドを使用しnameて元の描画メソッドを呼び出す必要があります。で絵を描くのと同じよう[super customDrawRect:rect];に、最後に

- (void)customDrawRect:(CGRect)rect { 

   ... 
   [super customDrawRect:rect];
}

#import <objc/runtime.h> 

@implementation UINavigationBar (CustomImage)

+ (void)initialize {

    Method originalDrawRectMethod = class_getInstanceMethod([self class], @selector(drawRect:));
    Method customDrawRectMethod = class_getInstanceMethod([self class], @selector(customDrawRect:));
    method_exchangeImplementations(originalDrawRectMethod, customDrawRectMethod);
}



- (void)customDrawRect:(CGRect)rect {

    UIImage *image = [UIImage imageNamed: @"topbar.jpg"];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];

    // original drawRect call
    [self customDrawRect:rect];
}


@end
于 2012-10-18T20:05:27.317 に答える