Как установить состояние UIButton, которое будет выделено после нажатия на него - PullRequest
14 голосов
/ 29 августа 2011

У меня есть типичное требование, при котором мне нужно держать кнопку в выделенном состоянии после ее нажатия.Мне нужно выполнить задачу, которая должна работать только тогда, когда кнопка находится в подсвеченном состоянии.На самом деле я устанавливаю состояние кнопки для подсветки программно.

[sender setHighlighted:YES];

И как только кнопка находится в подсвеченном состоянии, мне нужно выполнить другое действие.

- (IBAction)changeState: (UIButton*)sender
{   
    if (sender.highlighted == YES)
    {
        [self performSomeAtion:sender];
    }
}

Но, к моему ужасу, всякий раз, когда я нажимаю любую кнопку, вышеуказанное условие становится истинным, и действие выполняется неоднократно.Есть ли способ сохранить состояние UIButton, которое будет выделено после его нажатия?

EDIT - На самом деле мне нужно выполнить 3 различных действия для 3 различных состояний кнопки.Я уже использую выбранное состояние и нормальное состояние.Теперь мне нужно использовать выделенное состояние.

Ответы [ 10 ]

17 голосов
/ 29 августа 2011
[sender setSelected:YES]; 

или вы можете смоделировать этот эффект двумя изображениями для вашей кнопки UIB (notselectedimage.png и selectedimage.png), а затем сохранить состояние кнопки с помощью переменной BOOL, например BOOL buttonCurrentStatus;. Тогда в .h файле:

BOOL buttonCurrentStatus;

и в .m файле

// connect this method with Touchupinside function
- (IBAction)changeState:(UIButton*)sender
{
    /* if we have multiple buttons, then we can
       differentiate them by tag value of button.*/
    // But note that you have to set the tag value before use this method.

  if([sender tag] == yourButtontag){

    if (buttonCurrentStatus == NO)
    {
        buttonCurrentStatus = YES;
        [butt setImage: [UIImage imageNamed:@"selectedImage.png"] forState:UIControlStateNormal];
        //[self performSomeAction:sender];
    }
    else
    {
        buttonCurrentStatus = NO;
        [butt setImage:[UIImage imageNamed:@"notSelectedImage.png"] forState:UIControlStateNormal];
        //[self performSomeAction:sender];
    }   
  }
}
7 голосов
/ 08 февраля 2014
- (void)mybutton:(id)sender
{
    UIButton *button = (UIButton *)sender;
    button.selected = ![button isSelected]; // Important line
    if (button.selected)
    {
        NSLog(@"Selected");
        NSLog(@"%i",button.tag);
    }
    else
    {
        NSLog(@"Un Selected");
        NSLog(@"%i",button.tag);

    }
 }
4 голосов
/ 29 августа 2011

Подсвеченное состояние используется для выделения кнопки , когда она нажата.Событие касания в кнопке выделяет его.Вместо этого вы должны использовать «выбранное» состояние.

Если вы хотите выполнить действие после нажатия кнопки, не присоединяйте свой метод к событию изменения состояния, присоединяйте свой метод к событию TouchUpInside.

3 голосов
/ 04 апреля 2012

Я просто нахожу способ, поэтому делюсь им, на всякий случай ...

Я сохранил свою UIButton и установил одно изображение для каждого состояния (чтобы вы могли перейти к кнопке 4 состояния).Я установил UserInteractionEnabled на NO -> Эта кнопка не получит никакого прикосновения.Цель этой первой кнопки - показать состояние

. Я создаю вторую пользовательскую кнопку UIB с тем же кадром, что и у первой.Для этого ни одно изображение не будет установлено для состояния (это полностью прозрачная кнопка).Цель этой кнопки - поймать сенсорное событие.Поэтому я добавил цель к этой кнопке в событии TouchUpInside.И затем, когда событие вызывается, я меняю состояние первой кнопки на Отключено, Выделено, Выбрано или ни на одно из этих состояний (= Состояние по умолчанию).

Все работает как чудо!

2 голосов
/ 29 августа 2011

Как бы вы это ни описали, лучше создать подкласс UIView для создания собственной кнопки с тремя состояниями.

На самом деле, вы даже должны реализовать свой собственный многостраничный ButtonView и управлять состоянием, в котором он находится, через массив PNG для внешнего вида и массив состояний, чтобы узнать, сколько раз он был нажат.

1 голос
/ 29 августа 2011

Используйте [sender setSelected: YES];, думаю, это будет полезно для вас.

0 голосов
/ 27 декабря 2015

Согласно Apple, UIButton имеет свойство imageView :

Хотя это свойство доступно только для чтения, его собственные свойства доступны для чтения / записи. Используйте эти свойства для настройки внешнего вида и поведения вида кнопки

Это означает, что вы можете установить в IB (в раскадровке) изображение для этой кнопки и установить выделенное изображение:

  1. Откройте инспектор атрибутов.
  2. В разделе Кнопка выберите изображение.
  3. В этом же разделе измените настройку состояния на Выделенное.Обратите внимание, что изображение, которое вы выбрали по умолчанию, теперь исчезло, и теперь вы можете установить новое изображение для выделенного.
  4. Теперь у вас есть кнопка с настройкой 2 состояний и все, что вам нужно сделать во время выполнения, чтобы изменить button.highlighted = true.Кроме того, проверьте UIControl в Настройка атрибутов элемента управления для получения дополнительных состояний.

Вы также можете сделать это программно следующим образом:

Swift (и почти то же самое в Objective-C):

// Setting the highlighted image
self.someButton.imageView?.highlightedImage = UIImage(named: "imageNameFromImageAssest")
// someButton will now some the highlighted image and NOT the image set in the IB
self.someButton.imageView?.highlighted = true
0 голосов
/ 27 декабря 2014

Решение сложно, но возможно.

Проблема в том, что вы пытались изменить выделенный статус в методе действия кнопки, который, как я полагаю, выполняет очистку или проверку в конце действия и переключает выделенный статус. При попытке отладки вы получаете подсвеченный = 1, но в конце он изменится.

Странно, но ваша «кнопка 3 статусов» иногда полезна, когда вы хотите держать кнопку в «выделенном» режиме, например, в «выбранном» режиме, чтобы получить различное действие в зависимости от 3 статусов. Единственная проблема в том, что вы не смогли проанализировать это или переключить его в подсвеченный режим в методе действия кнопки, так как он сразу переключится в подсвеченный режим, когда пользователь нажмет на него И переключит его обратно в конце.

Решение использует отправку.

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [theButton setHighlighted:YES];
});

Это сделает трюк, и вы можете использовать 3 статуса.

0 голосов
/ 29 июля 2014

Только для iOS 7: вам следует рассмотреть возможность установки для параметра renderMode изображения значения UIImageRenderingModeAlwaysTemplate.Затем вы можете использовать tintColor для представления различных состояний.

см. Как применить tintColor к UIImage? и

см. Оттенок UIView со всеми его подпредставлениями

0 голосов
/ 29 августа 2011
UIButton *btn_tmp=sender;
    if(!(btn_tmp.selected))
    {
[btn_temp setHighlighted:YES];

}
...