2012-04-04 12 views
2

私はUIBarButtonItemをサブクラス化し、通常は更新イメージをディスパッチするボタンを作成しようとしていますが、読み込み時にはアクティビティスピナーを作成しています。私が持っている問題は、内部にカスタムビューを表示するためにボーダースタイルを取得できないことです。それは表示されません。CustomViewとBorderを持つUIBarButton

これは(私のUIBarButtonItemサブクラスのコンストラクタから)私のコードです:

self = [super initWithTitle:@"" style:UIBarButtonItemStyleBordered target:self action:nil]; 
UIView *viwInner = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 24,24)]; 
[self.customView addSubview:viwInner]; 

self.btnStandard = [UIButton buttonWithType:UIButtonTypeCustom]; 
[self.btnStandard setFrame:CGRectMake(0, 0, 24,24)]; 
UIImage *initialImage = [[UIImage imageNamed:@"refresh_24.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; 
[self.btnStandard setBackgroundImage:initialImage forState:UIControlStateNormal]; 
[self.btnStandard setBackgroundImage:initialImage forState:UIControlStateHighlighted]; 
[self.btnStandard setBackgroundImage:initialImage forState:UIControlStateSelected]; 
[self.btnStandard addTarget:self action:@selector(didTapInitialButton:) forControlEvents:UIControlEventTouchUpInside]; 
[viwInner addSubview:self.btnStandard]; 

self.btnLoading = [UIButton buttonWithType:UIButtonTypeCustom]; 
[self.btnLoading setFrame:CGRectMake(0, 0, 24,24)]; 
self.loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActionSheetStyleBlackOpaque]; 
[self.loadingView setHidesWhenStopped:true]; 
[self.loadingView stopAnimating]; 
[self.btnLoading addSubview:self.loadingView]; 
[self.btnLoading addTarget:self action:@selector(didTapAbortButton:) forControlEvents:UIControlEventTouchUpInside]; 
[viwInner addSubview:self.btnLoading]; 

return self; 

が、これは動作しない理由はありますか?

答えて

3

UIBarButtonItemにアニメーション画像を取得し、UIBarButtonItemStyleBorderedを維持するためのトリックがある:そして

UIImage *image = [UIImage animatedImageNamed:@"refresh-" duration:1.f]; 
self.button = [[UIBarButtonItem alloc] initWithImage:image 
               style:UIBarButtonItemStyleBordered 
               target:self 
               action:@selector(doSomething:)]; 

、画像のセット、アニメーションの各フレームに対して1枚の画像、および名前を作成その後、「リフレッシュ-0.png」、など「-1.pngをリフレッシュ」と:

refresh-0.pngrefresh-1.pngrefresh-2.png

アニメーションを停止したいときは、お尻の画像を置き換えます静的バージョンと上:

self.button.image = [UIImage imageNamed:@"refresh-0.png"]; 

それはまだすべてのこれらの画像を自分で作成する必要が重要な面倒だが、それはおそらく、あなた自身のボタンボーダーの背景を作成するよりも、より一貫性です。

+0

優れた技術。ありがとう。 – Echilon

-1

UIBarButtonItems(-initWithImage:style:target:action:または-initWithTitle:style:target:action:で作成)は、ボタン内の任意のビューをサポートしていないため、実行しようとしていることを行うことはできません。

UIActivityIndicatorViewをボタンの境界線をシミュレートした画像の上に配置してみることができます。 initWithCustomView:を使用して、ビューをボタンに追加することができます。

これが役に立ちます。 iOS5をでは

1

これを置き換えるのではなく、UIActivityIndi​​catorViewを使用してこれを行うには、ボタンの境界線を自分でレンダリングする必要があります。私が行うのは、UIBarButtonItemのcustomViewを境界を含むUIImageViewに設定し、その画像のサブビューとしてアクティビティビューを追加することです。

これで、境界線画像が表示されないという問題が発生します。 1つのバーカラーでのみ必要な場合は、シミュレータのスクリーンショットからそれを切り抜くことができます。複数のバーの色が必要な場合は、境界ピクセルだけでなく、境界線の透明度も取得したいと考えています。for which私はPythonスクリプトを作成しました。

関連する問題