2012-04-04 56 views
2

我已經子類UIBarButtonItem,並試圖使一個按鈕正常顯示刷新圖像,但加載時的活動微調器。我遇到的問題是我無法獲得有邊框的樣式來顯示內部的自定義視圖。它只是不顯示。自定義視圖和邊框的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

在iOS5的,有一種手段來得到一個動畫圖像劃分爲UIBarButtonItem和保持UIBarButtonItemStyleBordered

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

然後,創建一組圖像,對於動畫的每一幀中的一個圖像,並將其命名然後在「刷新0.png」,「刷新-1.png」等等:

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

當你想停止動畫,更換對接的圖像與靜態版本:

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

它仍然有自己創建這些圖像的顯著麻煩,但它可能比創建自己的按鈕,邊框背景更加一致。

+0

優秀的技術。謝謝。 – Echilon 2012-06-18 16:52:29

-1

由於UIBarButtonItems(使用-initWithImage:style:target:action:-initWithTitle:style:target:action:創建)不支持按鈕內部的任意視圖,因此無法執行您嘗試執行的操作。

您可以嘗試將UIActivityIndicatorView放置在模擬按鈕邊框的圖像頂部。然後,您可以使用initWithCustomView:將視圖添加到您的按鈕。

希望這會有所幫助。

1

要使用UIActivityIndi​​catorView完成此操作,而不是替換它,必須自己渲染按鈕邊框。我所做的是將UIBarButtonItem的customView設置爲包含邊框的UIImageView,並將該活動視圖添加爲該圖像的子視圖。

這會讓您面臨獲取邊框圖像的問題。如果你只需要一種條形顏色,那麼你可以從模擬器截圖中剪切出來;如果你需要多欄顏色,那麼你不僅需要獲取邊界像素,還需要邊框透明度,for which我寫了一個Python腳本。