2

UIBarButtonItemをサブクラス化して、更新画像を通常どおりに表示するボタンを作成しようとしていますが、読み込み時にアクティビティスピナーを作成しています。私が抱えている問題は、内部にカスタムビューを表示するための境界線のスタイルを取得できないことです。表示されないだけです。

これは私のコードです(私の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;

これが機能しない理由はありますか?

4

3 に答える 3

3

iOS5 では、アニメーション イメージを に取得してUIBarButtonItemを維持するためのトリックがありUIBarButtonItemStyleBorderedます。

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

次に、アニメーションのフレームごとに 1 つのイメージのセットを作成し、「refresh-0.png」、「refresh-1.png」などの名前を付けます。

リフレッシュ-0.png refresh-1.png refresh-2.png

アニメーションを停止したい場合は、ボタンの画像を静的バージョンに置き換えます。

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

これらすべての画像を自分で作成しなければならないのは依然としてかなり面倒ですが、独自の Button-border 背景を作成するよりもおそらく一貫性があります。

于 2012-06-17T08:48:00.587 に答える
1

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

これにより、境界画像を取得するという問題が残ります。1 つのバーの色でのみ必要な場合は、シミュレーターのスクリーンショットから切り取ることができます。複数のバーの色で必要な場合は、境界線のピクセルだけでなく、境界線の透明度も取得する必要があります。これについては、Python スクリプトを作成しました。

于 2013-05-11T05:42:15.240 に答える
-1

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

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

お役に立てれば。

于 2012-04-04T13:39:08.457 に答える