點擊'記錄'BarButtonItem後,我想保持它以編程方式突出顯示,直到記錄結束。 iOS的突出顯示圖形非常好,因此我想保留或設置該狀態。以編程方式突出顯示UIBarButtonItem
到目前爲止,我發現'setSelected'和'setHighlighted',但這些在UIBarButtonItem上不起作用。 關於如何解決這個問題的任何建議?先謝謝你,Koen。
點擊'記錄'BarButtonItem後,我想保持它以編程方式突出顯示,直到記錄結束。 iOS的突出顯示圖形非常好,因此我想保留或設置該狀態。以編程方式突出顯示UIBarButtonItem
到目前爲止,我發現'setSelected'和'setHighlighted',但這些在UIBarButtonItem上不起作用。 關於如何解決這個問題的任何建議?先謝謝你,Koen。
setSelected
和setHighlighted
在UIControls上正常工作,但不是UIBarButtonItems(它們不是UIControls)。
我建議使用UIBarButtonItem的- (void)setBackgroundImage:(UIImage *)backgroundImage forState:(UIControlState)state barMetrics:(UIBarMetrics)barMetrics
(文檔鏈接)方法將背景圖像更改爲模仿突出顯示的內容。
您還可以在項目上設置自定義UIView,該項目也模仿突出顯示(請參閱屬性)。
對於按鈕的兩種狀態,您可以使用兩個圖像,例如「UIControlStateNormal」狀態,您可以將圖像用於正常情況。
然後當按鈕被按下時,設置顯示它被按下的其他圖像,然後使用UIButton的isSelected方法檢查圖像。
希望這對你有一定的意義。
-1問題確認isSelected方法在UIButton上可用,但它特別要求UIBarButtonItem上的等效方法。 –
如果你絕對要使用默認的圖形,你可以在你的按鈕項目初始化爲
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)
創建這個按鈕例如btnMoreOut
的出口,你做的事:
btnMoreOut.tintColor = [UIColor colorWithRed:0.882 green:0.722 blue:0.169 alpha:1];
我希望這helps..Good好運:)
輝煌。爲我的實現完美工作! :) –
這就像一顆寶石! – Miki
如果添加UIBarButtonItem
與UIButton
支持它,你可以問問CustomView。
UIButton *button = (UIButton *)[self.barButtonItem customView];
[button setSelected:YES];
這個答案很好,唯一的問題是你需要投[self.barButtonItem customView];到UIButton。 (UIButton *)self.barButtonItem.customView;否則,效果很好。 –
是的,演員是必要的,但並不嚴重。你有沒有投下這個答案呢?只需編輯它。 –
我投了票。不知道downvote從哪裏來。 –
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;
}
你可以試試這個(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和你的代碼中的另一個函數。
如果你想改變只是標題屬性(例如,標題顏色),你可以調用setTitleTextAttributes:forState:
對於我來說,它比setTintColor:
(開卷賽格瑞推動畫過程中改變着色顏色中斷)更穩定。
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中,你必須說明這一點,而不是讓編譯器推斷發生了什麼事情,因爲它以前做過。
嗨邁克爾,你有一些關於在UIBarButtonItem中使用customView的示例代碼?我試圖實現它,但以黑色矩形結束,我希望它透明。有什麼建議麼? – Ckoeny
我已經通過使用UIImageView作爲customView解決了該問題。請將userInteractionEnabled設置爲TRUE。 – Ckoeny