Программно выделить UIBarButtonItem
после нажатия "записи" BarButtonItem я хотел бы, чтобы он программно выделялся, пока запись не закончилась. Выделение графики iOS очень хорошее, поэтому я хотел бы остаться или установить это состояние.
До сих пор я обнаружил "setSelected" и "setHighlighted", но они не работают на UIBarButtonItem.
Любые предложения о том, как это решить? Заранее спасибо, Koen.
Ответы
Ответ 1
setSelected
и setHighlighted
работают нормально в UIControls, но не UIBarButtonItems (которые не являются UIControls).
Я бы рекомендовал использовать метод UIBarButtonItem - (void)setBackgroundImage:(UIImage *)backgroundImage forState:(UIControlState)state barMetrics:(UIBarMetrics)barMetrics
(связанный с документацией), чтобы изменить фоновое изображение на то, что имитирует выделение.
Вы также можете установить пользовательский UIView для элемента, который также имитирует выделение (см. свойство customView
).
Ответ 2
Если вы абсолютно хотите использовать графику по умолчанию, вы можете инициализировать элемент своей кнопки как
UIBarButtonItem *toggleButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"MyButton"
style:UIBarButtonItemStyleBordered
target:someObject
action:@selector(doSomething:)];
и переключите его с помощью
toggleButtonItem.style = (toggleButtonItem.style == UIBarButtonItemStyleBordered)
? UIBarButtonItemStyleDone : UIBarButtonItemStyleBordered;
Вам также нужно будет использовать свойство style для чтения текущего состояния.
BOOL isSelected = (toggleButtonItem.style == UIBarButtonItemStyleDone)
Ответ 3
Если вы добавите UIBarButtonItem
с поддержкой UIButton
, вы можете просто запросить CustomView.
![UIBarButtonItem with a backing UIButton]()
UIButton *button = (UIButton *)[self.barButtonItem customView];
[button setSelected:YES];
Ответ 4
Вы создаете выход этой кнопки, например btnMoreOut
, и вы делаете:
btnMoreOut.tintColor = [UIColor colorWithRed:0.882 green:0.722 blue:0.169 alpha:1];
Надеюсь, это поможет... Удачи:)
Ответ 5
1) Получите ссылку на кнопку вашего бара.
2) Используя свойство style, назначьте его UIBarButtonItemStyleDone или UIBarButtonItemStylePlain на основе некоторого состояния.
NB. Вы можете получить состояние по-разному. Например, используя 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;
}
Ответ 6
Вы можете попробовать это (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
}
Вызовите setupInterface() в ViewDidLoad и еще одну функцию в вашем коде.
Ответ 7
Если вы хотите изменить только атрибуты названия (например, цвет заголовка), вы можете вызвать setTitleTextAttributes:forState:
Для меня он работает более стабильно, чем setTintColor:
(изменение цветовых разрывов оттенков во время разматывания анимации).
Ответ 8
p.a. ответ, преобразованный для Xcode 9, Swift 4.
Идея состоит в том, что стиль .done
подчеркивает - или жирный шрифт, в Swift 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 вы должны указать это, вместо того чтобы позволить компилятору сделать вывод о том, что происходит, как это было сделано ранее.
Ответ 9
Вы можете использовать два изображения для двух состояний кнопки, например, для одного состояния "UIControlStateNormal" вы можете использовать изображение для нормального состояния.
И затем, когда кнопка нажата, установите другое изображение, которое показывает его нажатие, затем изображение с проверкой, используя метод isSelected UIButton.
Надеюсь, это вам будет полезно.