Как установить состояние UIButton для выделения после нажатия
У меня типичное требование, когда мне нужно удерживать кнопку в выделенном состоянии после нажатия. Мне нужно выполнить задачу, которая должна работать только тогда, когда кнопка находится в выделенном состоянии. На самом деле я устанавливаю состояние кнопки для выделения программно.
[sender setHighlighted:YES];
И как только кнопка находится в выделенном состоянии, мне нужно выполнить другое действие.
- (IBAction)changeState: (UIButton*)sender
{
if (sender.highlighted == YES)
{
[self performSomeAtion:sender];
}
}
Но, к моему ужасу, всякий раз, когда я нажимаю любую кнопку, указанное выше условие становится истинным, и действие выполняется неоднократно. Есть ли способ, по которому я могу сохранить состояние UIButton после его нажатия?
EDIT. На самом деле мне нужно выполнить 3 разных действия для 3 разных состояний кнопки. Я уже использую выбранное состояние и нормальное состояние. Теперь мне нужно использовать выделенное состояние.
Ответы
Ответ 1
[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];
}
}
}
Ответ 2
- (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);
}
}
Ответ 3
Выбранное состояние используется для выделения кнопки во время ее касания. Нажатие кнопки на кнопке подчеркивает ее. Вместо этого вы должны использовать "выбранное" состояние.
Если то, что вы хотите сделать, это выполнить действие после нажатия кнопки, не прикреплять свой метод к событию изменения состояния, присоединить свой метод к событию TouchUpInside.
Ответ 4
Я просто нахожу способ, поэтому я разделяю его, на всякий случай...
Я сохранил свой UIButton и установил одно изображение для каждого состояния (чтобы вы могли перейти к кнопке с четырьмя состояниями).
Я установил UserInteractionEnabled в НЕТ → Эта кнопка не получит никакого касания.
Цель этой первой кнопки - показать состояние
Я создаю второй пользовательский UIButton с тем же фреймом, что и первый. Для этого одно изображение не будет установлено для состояния (это полностью прозрачная кнопка). Цель этой кнопки - захватить событие касания. Поэтому я добавил цель этой кнопки в событии TouchUpInside. И затем, когда событие запущено, я изменяю состояние первой кнопки на Disabled, Highlighted, Selected или ни одно из этих состояний (= Состояние по умолчанию).
Все работает как шарм!
Ответ 5
Как вы это описываете, вам лучше сгруппировать UIView, чтобы создать свою собственную кнопку с тремя состояниями.
На самом деле, вы даже должны реализовать свой собственный multistate buttonView и управлять состоянием внутри себя через массив PNG для внешнего вида и массив состояний, чтобы знать, сколько раз он был нажат.
Ответ 6
Используйте [sender setSelected: YES];
, я думаю, он вам будет полезен.
Ответ 7
UIButton *btn_tmp=sender;
if(!(btn_tmp.selected))
{
[btn_temp setHighlighted:YES];
}
Ответ 8
Только для iOS 7: вы должны рассмотреть возможность установки образа renderMode в UIImageRenderingModeAlwaysTemplate. Затем вы можете использовать tintColor для представления различных состояний.
см. Как применить tintColor к UIImage?
и
см. Отметьте UIView со всеми его областями
Ответ 9
Решение сложное, но возможно.
Проблема заключается в том, что вы попытались изменить выделенный статус в методе действий кнопки, который, я полагаю, выполняет очистку или проверку в конце действия и переключает выделенный статус. Когда вы пытаетесь отладить его, вы получаете выделенное value = 1, но оно будет меняться в конце.
Странно, но ваша кнопка "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 состояния.
Ответ 10
Согласно Apple, UIButton обладает свойством imageView:
Хотя это свойство доступно только для чтения, его собственные свойства читаются/записываются. Используйте эти свойства для настройки внешнего вида и поведения вида кнопок
Это означает, что вы можете установить в IB (в раскадровке) изображение для этой кнопки и установить выделенное изображение:
- Откройте инспектор атрибутов.
- В разделе Кнопка выберите изображение.
- В этом же разделе измените конфигурацию состояния на выделенное. Обратите внимание, что изображение, выбранное по умолчанию, исчезло, и теперь вы можете установить новое изображение для выделенного.
- Теперь у вас есть кнопка с 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