3

カテゴリを介して drawRect をオーバーライドすることで、UINavigationBar にカスタム背景画像を追加しています。

- (ボイド)drawRect:(CGRect)rect{
    [[UIImage imageNamed:@"navbar.png"] drawInRect:CGRectMake( 0, self.frame.size.height-44, self.frame.size.width, 44 )];
}

このソリューションは、navigationitem.prompt プロパティを使用しようとするまではうまくいくようです。プロンプトを提示するスムーズなアニメーションを実行する代わりに、突然それを実行します。

これを改善する方法について何か提案はありますか? または、背景画像を設定する別の方法。

PS。ビューがプッシュ/ポップするときに物事が再配置される方法のために、背景画像をサブビューとして追加することを避けようとしています。そして、すべてのビューの viewDidAppear で sendSubviewToBack を使用したくありません。

ティア!

編集:私はまた、画像を伸ばすことができればうまくいく方法のスウィズリングも試しましたが、画像は伸縮可能ではないので、たまたまシフトを行うアニメーションを利用する方法を理解する必要がありますストレッチ。

編集:以下の私のハッキーな答えを見てください

4

1 に答える 1

0

非常に「ハック」ですが、これは私がやりたいことを実行できる最も近いものです...

基本的に、メソッドのスウィズリングでは、単純に画像を引き延ばすだけではうまくいきませんでした。その代わりに、角を別の透明な画像にしてサブビューとして追加し、ストレッチ アニメーションの影響を受けないようにしました。

だから私のカテゴリーは今このように見えます..

#import "UINavigationBar+custom.h"

#define cornersTag 1

@implementation UINavigationBar (UINavigationBarCategory)

-(void)setCornersIfNeeded{
 UIImageView *corners = (UIImageView*)[self viewWithTag:cornersTag];
 if(!コーナー){
  UIImage *img = [[UIImage imageNamed:@"navbar_corners.png"] stretchableImageWithLeftCapWidth:10 topCapHeight:0];
  corners = [[[UIImageView alloc] initWithImage:img] autorelease];
  corners.frame = CGRectMake(0, 0, self.frame.size.width, img.size.height);
  corners.tag = コーナータグ;
  [self addSubview:コーナー];
 }
}

- (void)customDrawRect:( CGRect )rect{
 [self customDrawRect:rect];
 [[UIImage imageNamed:@"navbar.png"] drawInRect:rect];
 [self setCornersIfNeeded];
}

@終わり

メソッド スウィズリングの詳細については... http://www.cocoadev.com/index.pl?MethodSwizzling およびiPhone デバイスのメソッド スウィズル

于 2009-10-25T20:20:10.053 に答える