2011-11-25 133 views
16

點擊'記錄'BarButtonItem後,我想保持它以編程方式突出顯示,直到記錄結束。 iOS的突出顯示圖形非常好,因此我想保留或設置該狀態。以編程方式突出顯示UIBarButtonItem

到目前爲止,我發現'setSelected'和'setHighlighted',但這些在UIBarButtonItem上不起作用。 關於如何解決這個問題的任何建議?先謝謝你,Koen。

回答

9

setSelectedsetHighlighted在UIControls上正常工作,但不是UIBarButtonItems(它們不是UIControls)。

我建議使用UIBarButtonItem的- (void)setBackgroundImage:(UIImage *)backgroundImage forState:(UIControlState)state barMetrics:(UIBarMetrics)barMetrics(文檔鏈接)方法將背景圖像更改爲模仿突出顯示的內容。

您還可以在項目上設置自定義UIView,該項目也模仿突出顯示(請參閱屬性)。

+0

嗨邁克爾,你有一些關於在UIBarButtonItem中使用customView的示例代碼?我試圖實現它,但以黑色矩形結束,我希望它透明。有什麼建議麼? – Ckoeny

+1

我已經通過使用UIImageView作爲customView解決了該問題。請將userInteractionEnabled設置爲TRUE。 – Ckoeny

-2

對於按鈕的兩種狀態,您可以使用兩個圖像,例如「UIControlStateNormal」狀態,您可以將圖像用於正常情況。

然後當按鈕被按下時,設置顯示它被按下的其他圖像,然後使用UIButton的isSelected方法檢查圖像。

希望這對你有一定的意義。

+0

-1問題確認isSelected方法在UIButton上可用,但它特別要求UIBarButtonItem上的等效方法。 –

5

如果你絕對要使用默認的圖形,你可以在你的按鈕項目初始化爲

UIBarButtonItem *toggleButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"MyButton" 
                    style:UIBarButtonItemStyleBordered 
                    target:someObject 
                    action:@selector(doSomething:)]; 

toggleButtonItem.style = (toggleButtonItem.style == UIBarButtonItemStyleBordered) 
         ? UIBarButtonItemStyleDone : UIBarButtonItemStyleBordered; 

您還需要使用的樣式屬性來讀取其切換目前的狀態。

BOOL isSelected = (toggleButtonItem.style == UIBarButtonItemStyleDone) 
3

創建這個按鈕例如btnMoreOut的出口,你做的事:

btnMoreOut.tintColor = [UIColor colorWithRed:0.882 green:0.722 blue:0.169 alpha:1]; 

我希望這helps..Good好運:)

+0

輝煌。爲我的實現完美工作! :) –

+0

這就像一顆寶石! – Miki

5

如果添加UIBarButtonItemUIButton支持它,你可以問問CustomView。

UIBarButtonItem with a backing UIButton

UIButton *button = (UIButton *)[self.barButtonItem customView]; 
[button setSelected:YES]; 
+0

這個答案很好,唯一的問題是你需要投[self.barButtonItem customView];到UIButton。 (UIButton *)self.barButtonItem.customView;否則,效果很好。 –

+0

是的,演員是必要的,但並不嚴重。你有沒有投下這個答案呢?只需編輯它。 –

+0

我投了票。不知道downvote從哪裏來。 –

2

1)獲取到您的欄按鈕的引用。

2)使用style屬性,根據某些狀態將其分配給UIBarButtonItemStyleDone或UIBarButtonItemStylePlain。

注意:你可以通過各種方式獲得狀態。例如,使用NSUserDefaults,在那裏保存一個鍵值對。拉出值,並抓住一些BOOL表示來測試。然後,在此線:

self.myButton.style = self.someState ? UIBarButtonItemStyleDone : UIBarButtonItemStylePlain; 

或者與默認所有的嵌套這樣的:

self.myButton.style = [[NSUserDefaults standardUserDefaults] 
boolForKey:@"someKey"] ? UIBarButtonItemStyleDone : UIBarButtonItemStylePlain; 

沒有三元運算符:

if ([[NSUserDefaults standardUserDefaults] 
    boolForKey:@"someKey"]) { 
self.myButton.style = UIBarButtonItemStyleDone; 
} else { 
self.myButton.style = UIBarButtonItemStylePlain; 
} 
+0

我厭倦了要求人們添加解釋,並且在「僅鏈接」選項中沒有「僅限代碼」選項。請添加解釋! – Mark

+0

@Mark Ok,讓我知道那是否足夠適合你。現在有意義嗎?我使用的三元運算符可能會拋出你。 – smileBot

+1

謝謝@cocoanut,這樣好多了。 – Mark

0

你可以試試這個(SWIFT):

func setupInterface(){ 

    var myButton = UIBarButtonItem() 
    if (your_condition){ 
     myButton = UIBarButtonItem(image: UIImage(named: "img_selected"), style: .Plain, target: self, action: Selector("DoSomething:")) 
    } 
    else{ 
     myButton = UIBarButtonItem(image: UIImage(named: "img_unselected"), style: .Plain, target: self, action: Selector("DoSomething:")) 
    } 
    navigationItem.rightBarButtonItem = myButton 
    } 

在Vi中調用setupInterface() ewDolLoad和你的代碼中的另一個函數。

0

如果你想改變只是標題屬性(例如,標題顏色),你可以調用setTitleTextAttributes:forState:

對於我來說,它比setTintColor:(開卷賽格瑞推動畫過程中改變着色顏色中斷)更穩定。

0

p.a.'s answer,轉換爲Xcode的9,夫特4.
的想法是,在.done樣式亮點 - 或加粗,在夫特4 - 按鈕文本。使用三元運算

let toggleButtonItem = UIBarButtonItem(title: "MyButton", 
             style: .plain, 
             target: self, 
             action: #selector(doSomething)) 

切換按鈕項高亮狀態,像這樣:在未突出顯示狀態

初始化按鈕項

toggleButtonItem.style = (toggleButtonItem.style == .plain) ? 
         toggleButtonItem.style = .done : toggleButtonItem.style = .plain 

,或者可選地,請使用像這樣的常規if/else語句切換突出顯示狀態:

if toggleButtonItem.style == .plain { 
    toggleButtonItem.style = .done 
} 
else { 
    toggleButtonItem.style = .plain 
} 

而且,設置一個布爾值,以檢查按鈕項被高亮顯示:

var isHighlighted: Bool = (toggleButtonItem.style == .done) 

注:

  • bordered風格被棄用iOS 8的,所以我用.plain在這裏。它們都將按鈕項目的文本呈現爲未着色狀態。
  • #selector函數必須是@IBAction,或者它必須以@objc爲前綴,以避免「Objective-C推理」問題。例如:

    @objc func doSomething() { ... } 
    

    ,或者,如果您已連接一個動作按鈕項:

    @IBAction func doSomething() { ... } 
    

    這兩個函數聲明說,他們正在使用基於Objective-C的的功能編譯器。這是必需的,因爲#selector是一個Objective-C的東西,在Swift 4中,你必須說明這一點,而不是讓編譯器推斷發生了什麼事情,因爲它以前做過。

相關問題