Программно выделить UIBarButtonItem - программирование
Подтвердить что ты не робот

Программно выделить UIBarButtonItem

после нажатия "записи" BarButtonItem я хотел бы, чтобы он программно выделялся, пока запись не закончилась. Выделение графики iOS очень хорошее, поэтому я хотел бы остаться или установить это состояние.

До сих пор я обнаружил "setSelected" и "setHighlighted", но они не работают на UIBarButtonItem. Любые предложения о том, как это решить? Заранее спасибо, Koen.

4b9b3361

Ответ 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.

Надеюсь, это вам будет полезно.