it-swarm.com.ru

Как установить состояние UIButton, которое будет выделено после нажатия на него

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

[sender setHighlighted:YES]; 

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

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

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

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

14
A for Alpha
[sender setSelected:YES]; 

или вы можете смоделировать этот эффект двумя изображениями для вашей UIButton (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];
    }   
  }
}
15
Vijay-Apple-Dev.blogspot.com
- (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);

    }
 }
7
svmrajesh

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

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

4
progrmr

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

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

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

Все работает как шарм!

3
Hal

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

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

2
Kheldar

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

1
Narayana

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

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

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

0
John Henckel

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

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

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

  1. Откройте инспектор атрибутов.
  2. В разделе Button выберите изображение.
  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
OhadM
UIButton *btn_tmp=sender;
    if(!(btn_tmp.selected))
    {
[btn_temp setHighlighted:YES];

}
0
Narayana

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

Проблема в том, что вы пытались изменить выделенный статус в методе действия кнопки, который, как я полагаю, выполняет очистку или проверку в конце действия и переключает выделенный статус. Когда вы пытаетесь отладить его, вы получаете выделенный = 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
BootMaker