保持触摸后select一个UIButton

在用户点击一个button后,我希望在执行networking操作的过程中,该button保持按下状态。 networking操作完成后,我希望button返回到默认状态。

我已经尝试调用 – [UIButton setSelected:YES]button按下后(与我的networkingop完成后相应的调用 – [UIButton setSelected:NO] ),但它似乎并没有做任何事情。 同样的事情,如果我叫setHighlighted:

我想我可以尝试交换背景图像来表示networking运行期间的选定状态,但这似乎是一个黑客。 有更好的build议吗?

这是我的代码看起来像:

 - (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; } 

你如何设置button上的不同UIControlStates的图像? 你是否设置UIControlStateHighlighted以及UIControlStateSelected的背景图像?

 UIImage *someImage = [UIImage imageNamed:@"SomeResource.png"]; [button setBackgroundImage:someImage forState:UIControlStateHighlighted]; [button setBackgroundImage:someImage forState:UIControlStateSelected]; 

如果您在button触摸事件中设置了选定状态,而不是触及内部,那么您的button实际上将处于高亮+选定状态,因此您也需要设置该状态。

 [button setBackgroundImage:someImage forState:(UIControlStateHighlighted|UIControlStateSelected)]; 

编辑:

总结我在评论中的言论,并解决你发布的代码…你需要设置你的背景图像的全部UIControl状态,根据你的代码片断,这个控制状态将被禁用+select+在networking操作期间突出显示。 这意味着你需要这样做:

 [button setBackgroundImage:someImage forState:(UIControlStateDisabled|UIControlStateHighlighted|UIControlStateSelected)]; 

如果你删除highlighted = YES ,那么你会需要这样的:

 [button setBackgroundImage:someImage forState:(UIControlStateDisabled|UIControlStateSelected)]; 

获取图片?

我有一个更简单的方法。 只需使用“执行select器”0延迟执行[button setHighlighted:YES] 。 这将在当前的runloop结束后执行重新加亮。

 - (IBAction)buttonSelected:(UIButton*)sender { NSLog(@"selected %@",sender.titleLabel.text); [self performSelector:@selector(doHighlight:) withObject:sender afterDelay:0]; } - (void)doHighlight:(UIButton*)b { [b setHighlighted:YES]; } 

尝试使用NSOperationQueue来实现这一点。 试试代码如下:

 [[NSOperationQueue mainQueue] addOperationWithBlock:^{ theButton.highlighted = YES; }]; 

希望这可以帮助。

“开机时一切都变好了”

  button.selected = !button.selected; 

在将接口连接到Interface Builder中的button之后完美地工作。

您不需要setBackgroundImage:forState:,构build器允许您指定背景(如果需要,resize)或/和前景(不resize)的图像。

使用块,所以你不必build立一个单独的方法:

 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0), dispatch_get_main_queue(), ^{ theButton.highlighted = YES; }); 

更新

要清楚,你仍然需要设置组合状态的背景(或普通图像),以及像sbrocket这样的普通图像。 在某个时候,你的button将被选中和突出显示,除非你做这样的事情,否则你将不会有这个图像:

 [button setBackgroundImage:someImage forState (UIControlStateHighlighted|UIControlStateSelected)]; 

否则,您的button可以回退到UIControlStateNormal图像,以查看简短的选中的+突出显示的状态,您将看到一个闪光灯。

我有一个类似的问题,我想要一个button,保持点击后突出显示。 问题是如果你尝试使用setHighlighted:YES在你内部点击action,它会在你点击action后立即重置, - (IBAction)checkInButtonPushed

我通过使用这样的NSTimer解决了这个问题

 NSTimer *timer; timer = [NSTimer scheduledTimerWithTimeInterval: 0.01 target: self selector: @selector(selectCurrentIndex) userInfo: nil repeats: NO]; 

然后从我的selectCurrentIndex方法调用setHighlighted:YES 。 我使用常规的UIButtonTypeRoundedRectbutton。

在迅速,我像下面这样做。

我创build了一个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 } } } 

为我完美的作品。

我有另一种方法…如果你不想使用图像,你想要一个按下button的效果,你可以inheritancebutton,这里是我的代码:

在.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)实现。 它假定您已经设置了突出显示的图像状态,并将所选和选定的突出显示的状态configuration为使用相同的图像。

 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; }); }); };