質問

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

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

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

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

PS。ビューがプッシュ/ポップされるときに物事が再配置される方法のために、サブビューとして背景画像を追加することを避けようとしています。そして、すべてのビューのviewDidAppearでSubviewToBackを送信するのは嫌です。

TIA!

編集:メソッドのスウィズリングも試してみましたが、画像を伸縮させることができればうまくいきますが、画像は伸縮可能でないため、たまたまシフトを行うアニメーションをタップする方法を理解する必要がありますストレッチの代わりに。

編集:下記の私のハッキーな答えをご覧ください

役に立ちましたか?

解決

非常に" hacky&quot ;;しかし、これは私が望んでいることをするのに最も近い方法です...

基本的に、メソッドがスウィズルするとき、単に画像を引き伸ばすことは、角が丸くなっていたのでうまくいきませんでした。代わりに、コーナーを個別の透明なimgにし、ストレッチアニメーションの影響を受けないようにサブビューとして追加します。

つまり、私のカテゴリは次のようになります。

#import "UINavigationBar+custom.h"

#define cornersTag 1

@implementation UINavigationBar (UINavigationBarCategory)

-(void)setCornersIfNeeded{
 UIImageView *corners = (UIImageView*)[self viewWithTag:cornersTag];
 if(!corners){
  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 = cornersTag;
  [self addSubview:corners];
 }
}

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

@end

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top