#iphone #ios4 #uibutton
#iPhone #ios4 #кнопка uibutton
Вопрос:
У меня есть кнопка UIButton со стилем «Info Dark», настроенная в построителе интерфейсов в моем приложении для iPhone 4. Одним из свойств кнопки является «Подсвеченный», который отображает белую подсветку вокруг кнопки.
Я хотел бы включать и выключать эту белую подсветку, указывая, активна ли функция кнопки или нет.
Кнопка связана с событием «Touch up inside» в построителе интерфейса с помощью этого обратного вызова:
infoButton.highlighted = !infoButton.highlighted;
После первого касания подсветка исчезает и не переключается, как я ожидаю. Что еще мне нужно сделать, чтобы переключить выделение и отобразить состояние кнопки?
Спасибо!
Обновление: при загрузке из конструктора интерфейсов кнопка остается выделенной, даже когда вид появляется / исчезает. Причиной этого является свойство конструктора интерфейса «показывает касание при выделении». Если я назначу приведенный выше код другой кнопке, кнопка info будет включаться и выключаться, как и ожидалось. Однако прикосновения к самой кнопке info влияют на приведенный выше код, в результате чего кнопка теряет «сенсорную» подсветку
Обновление 2: я добавил еще одну информационную кнопку, прямо под первой информационной кнопкой, в построителе интерфейса и заставил ее постоянно светиться. Чтобы создать видимость переключателя, я скрываю и показываю кнопку glowInfoButton под реальной кнопкой. Это работает так, как ожидалось:
infoButton.highlighted = NO;
glowInfoButton.highlighted = YES;
glowInfoButton.enabled = NO;
glowInfoButton.hidden = YES;
- (IBAction)toggleInfoMode:(id)sender {
// infoButton.selected = !infoButton.selected;
glowInfoButton.hidden = !glowInfoButton.hidden;
}
Ответ №1:
Highlighted
Изображение отображается при нажатии кнопки UIButton и управляется внутри самой кнопки UIButton.
Вы ищете Selected
свойство. Вы можете установить выбранное изображение в IB, а затем вставить a infoButton.selected = !infoButton.isSelected;
в свой обратный вызов touchUpInside.
Ответ №2:
Выделенное свойство так не работает, кнопки не переключаются.
Это просто для того, чтобы узнать, нажата ли кнопка, если я прав.
Если вы хотите реализовать эту функциональность, я рекомендую вам подкласс UIButton или UIControl.
Комментарии:
1. Когда я устанавливаю свойство highlighted в построителе интерфейса, подсветка остается включенной, что заставляет меня поверить, что я могу каким-то образом заставить ее оставаться включенной.
Ответ №3:
Теперь, когда я вижу, что вам действительно нужно, я бы посоветовал подкласс UIButton и проверить вызов события, а затем соответствующим образом переключить состояние выделения. Вы можете сделать это, не добавляя фиктивную кнопку.
в файле реализации пользовательского класса кнопок поместите следующий код или аналогичный:
#import "HighlightedButton.h"
@implementation HighlightedButton
BOOL currentHighlightState;
-(void)toggleHighlight:(id)sender {
self.highlighted = currentHighlightState;
}
-(void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {
//get the string indicating the action called
NSString *actionString = NSStringFromSelector(action);
//get the string for the action that you want to check for
NSString *touchUpInsideMethodName = [[self actionsForTarget:target forControlEvent:UIControlEventTouchUpInside] lastObject];
if ([touchUpInsideMethodName isEqualToString:actionString]){
//toggle variable
currentHighlightState = !currentHighlightState;
//allow the call to pass through
[super sendAction:action to:target forEvent:event];
//toggle the property after a delay (to make sure the event has processed)
[self performSelector:@selector(toggleHighlight:) withObject:nil afterDelay:.2];
} else {
//not an event we are interested in, allow it pass through with no additional action
[super sendAction:action to:target forEvent:event];
}
}
@end
Это был быстрый запуск при правильном решении, при переключении есть мерцание, которое вам может не понравиться. Я уверен, что если вы поиграете с некоторыми изменениями, которые можно исправить. Я попробовал, и мне это действительно нравится для вашего заявленного случая.
Ответ №4:
Выделенное состояние кнопки UIButton — это просто установка альфа-символа кнопки на 0,5f. Поэтому, если вы настроили кнопку так, чтобы она не менялась при выделении, просто переключите альфа-значение между 0,1 и 0,5.
Например:
- (void)buttonPressed:(id)sender {
if((((UIButton*)sender).alpha) != 1.0f){
[((UIButton*)sender) setAlpha:1.0f];
} else {
[((UIButton*)sender) setAlpha:0.5f];
}
}
Ответ №5:
Возможно, то, что вы действительно хотите, это
infoButton.enabled = NO;
Это затемнит кнопку и отключит касания, если установлено значение «нет», разрешит нормальную работу, если установлено значение «ДА».
или в вашем случае:
infoButton.enabled = !infoButton.isEnabled;
чтобы переключить доступность того же.
Если вы добавите это в свое событие touchupinside, конечно, оно будет работать только в первый раз. После этого отключается и не получает события касания. Вы бы поместили его в другой метод, который решает, следует ли включать кнопку или нет.
Если вы действительно хотите, чтобы оно менялось при каждом нажатии, вам, вероятно, следует использовать переключатель или вы можете посмотреть на методы -imageForState , -setTitle:forState и / или -setTitleColor:forState . Если вы хотите переключать внешний вид при каждом прикосновении к нему, вы можете изменить их.
Комментарии:
1. Я думал вот о чем: небольшая, ненавязчивая кнопка UIButton с информацией в темном стиле в углу моего контроллера просмотра. При нажатии и «переключении» все элементы управления на контроллере представления переходят в режим «информация», отображая всплывающее окно с описанием того, что они делают. Вот почему я действительно хочу, чтобы кнопка оставалась выделенной и была «переключаемой» и выключалась, включая и отключая этот режим справки.
2. Сам я бы решил сделать это, скорее всего, поменяв местами изображения на кнопке, как было предложено. Я вижу ваше обновление и что теперь вы получаете желаемый результат. Мне кажется неправильным использовать для этого другую кнопку, когда вы не используете ее ни для чего, кроме внешнего вида. Если это сработает, кто может поспорить.