После того, как мой пользователь нажимает кнопку, я бы хотел, чтобы эта кнопка оставалась нажатой во время выполнения сетевой операции. Когда сетевая операция будет завершена, я хочу, чтобы кнопка вернулась в состояние по умолчанию.
Я пробовал позвонить - [UIButton setSelected:YES]
сразу после нажатия кнопки (с соответствующим вызовом - [UIButton setSelected:NO]
после завершения моей сетевой операции), но, похоже, он ничего не делает. То же самое, если я позвоню setHighlighted:
.
Я полагаю, я мог бы попробовать заменить фоновое изображение, чтобы обозначить выбранное состояние на время сетевой операции, но это похоже на взлом. Есть лучшие предложения?
Вот как выглядит мой код:
- (IBAction)checkInButtonPushed
{
self.checkInButton.enabled = NO;
self.checkInButton.selected = YES;
self.checkInButton.highlighted = YES;
[self.checkInActivityIndicatorView startAnimating];
[CheckInOperation startWithPlace:self.place delegate:self];
}
- (void)checkInCompletedWithNewFeedItem:(FeedItem*)newFeedItem wasNewPlace:(BOOL)newPlace possibleError:(NSError*)error;
{
[self.checkInActivityIndicatorView stopAnimating];
self.checkInButton.enabled = YES;
self.checkInButton.selected = NO;
self.checkInButton.highlighted = NO;
}
У меня есть способ попроще. Просто используйте "performSelector" с нулевой задержкой для выполнения
[button setHighlighted:YES]
. Это выполнит повторное выделение после завершения текущего цикла выполнения.- (IBAction)buttonSelected:(UIButton*)sender { NSLog(@"selected %@",sender.titleLabel.text); [self performSelector:@selector(doHighlight:) withObject:sender afterDelay:0]; } - (void)doHighlight:(UIButton*)b { [b setHighlighted:YES]; }
источник
«Все становится лучше, когда включаешь питание»
button.selected = !button.selected;
работает отлично ... после того, как я подключил розетку к кнопке в Интерфейсном Разработчике.
Вам не нужно устанавливать BackgroundImage: forState :, построитель позволяет вам указать фоновые изображения (при необходимости размер изменяется) и / или изображения переднего плана (без изменения размера).
источник
Для этого попробуйте использовать NSOperationQueue. Попробуйте следующий код:
[[NSOperationQueue mainQueue] addOperationWithBlock:^{ theButton.highlighted = YES; }];
Надеюсь это поможет.
источник
Используйте блок, чтобы не создавать целый отдельный метод:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0), dispatch_get_main_queue(), ^{ theButton.highlighted = YES; });
Обновить
Чтобы было понятно, вам все равно нужно установить фон (или нормальное изображение) для состояний комбинации, а также для обычных, таких как sbrocket, говорит в принятом ответе. В какой-то момент ваша кнопка будет выделена и выделена, и у вас не будет изображения для этого, если вы не сделаете что-то вроде этого:
[button setBackgroundImage:someImage forState (UIControlStateHighlighted|UIControlStateSelected)];
В противном случае ваша кнопка может вернуться к изображению UIControlStateNormal для краткого выбранного + выделенного состояния, и вы увидите вспышку.
источник
dispatch_get_current_queue()
считается «ненадежным».dispatch_after
а не вdispatch_async
?dispatch_async
лучший выбор.Я делаю это так быстро.
Я создал подкласс
UIButton
и реализовал настраиваемое свойствоstate
class ActiveButton: UIButton { private var _active = false var active:Bool { set{ _active = newValue updateState() } get{ return _active } } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.addTarget(self, action: #selector(ActiveButton.touchUpInside(_:)), forControlEvents: .TouchUpInside) } func touchUpInside(sender:UIButton) { active = !active } private func updateState() { NSOperationQueue.mainQueue().addOperationWithBlock { self.highlighted = self.active } } }
У меня отлично работает.
источник
У меня была аналогичная проблема, когда я хотел, чтобы кнопка оставалась выделенной после нажатия. Проблема в том, что если вы попытаетесь использовать действие
setHighlighted:YES
внутри себя, оно будет сброшено сразу после того, как вы нажмете действие,- (IBAction)checkInButtonPushed
Я решил это, используя такой NSTimer
NSTimer *timer; timer = [NSTimer scheduledTimerWithTimeInterval: 0.01 target: self selector: @selector(selectCurrentIndex) userInfo: nil repeats: NO];
а затем вызовите
setHighlighted:YES
из моегоselectCurrentIndex
метода. Пользуюсь штатнымиUIButtonTypeRoundedRect
кнопками.источник
У меня есть другой способ ... если вы не хотите использовать изображения и хотите получить эффект нажатой кнопки, вы можете создать подкласс Button и вот мой код:
в файле .h:
@interface reservasButton : UIButton { BOOL isPressed; } @end
В файле .m:
#import <QuartzCore/QuartzCore.h> @implementation reservasButton -(void)setupView { //This is for Shadow self.layer.shadowColor = [UIColor blackColor].CGColor; self.layer.shadowOpacity = 0.5; self.layer.shadowRadius = 1; self.layer.shadowOffset = CGSizeMake(2.0f, 2.0f); //comment // self.layer.borderWidth = 1; self.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; self.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; // [self setBackgroundColor:[UIColor whiteColor]]; // self.opaque = YES; } -(id)initWithFrame:(CGRect)frame{ if((self = [super initWithFrame:frame])){ [self setupView]; } return self; } -(id)initWithCoder:(NSCoder *)aDecoder{ if((self = [super initWithCoder:aDecoder])){ [self setupView]; } return self; } //Here is the important code -(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ if (isPressed == FALSE) { self.contentEdgeInsets = UIEdgeInsetsMake(1.0,1.0,-1.0,-1.0); self.layer.shadowOffset = CGSizeMake(1.0f, 1.0f); self.layer.shadowOpacity = 0.8; [super touchesBegan:touches withEvent:event]; isPressed = TRUE; } else { self.contentEdgeInsets = UIEdgeInsetsMake(0.0,0.0,0.0,0.0); self.layer.shadowOffset = CGSizeMake(2.0f, 2.0f); self.layer.shadowOpacity = 0.5; [super touchesEnded:touches withEvent:event]; isPressed = FALSE; } } `
источник
Вот реализация C # / MonoTouch (Xamarin.iOS) с использованием подходов, представленных выше. Предполагается, что вы уже установили состояние «Выделенное изображение», и настраивает выбранные и выделенные | выделенные состояния для использования одного и того же изображения.
var selected = button.BackgroundImageForState(UIControlState.Highlighted); button.SetBackgroundImage(selected, UIControlState.Selected); button.SetBackgroundImage(selected, UIControlState.Selected | UIControlState.Highlighted); button.TouchUpInside += delegate { NSTimer.CreateScheduledTimer(TimeSpan.FromMilliseconds(0), delegate { button.Highlighted = true; NSTimer.CreateScheduledTimer(TimeSpan.FromMilliseconds(200), delegate { button.Highlighted = false; }); }); };
источник