保持触摸后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
。 我使用常规的UIButtonTypeRoundedRect
button。
在迅速,我像下面这样做。
我创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; }); }); };