在我的用户点击一个按钮后,我希望该按钮在我执行网络操作期间保持按下状态。网络操作完成后,我希望按钮返回默认状态。
我尝试在按下按钮后调用 - [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;
}
答案 0 :(得分:73)
如何为按钮上的不同UIControlStates
设置图像?您是否为UIControlStateHighlighted
以及UIControlStateSelected
设置了背景图片?
UIImage *someImage = [UIImage imageNamed:@"SomeResource.png"];
[button setBackgroundImage:someImage forState:UIControlStateHighlighted];
[button setBackgroundImage:someImage forState:UIControlStateSelected];
如果您在按钮触摸事件而不是在内部触摸上设置选定状态,则您的按钮实际上将处于突出显示的+选定状态,因此您也需要设置该状态。
[button setBackgroundImage:someImage forState:(UIControlStateHighlighted|UIControlStateSelected)];
总结我在评论中的评论并解决您发布的代码...您需要为您所在的完整UIControl
州设置背景图片。根据您的代码段,在网络操作期间,控制状态将被禁用+选中+突出显示。这意味着你需要这样做:
[button setBackgroundImage:someImage forState:(UIControlStateDisabled|UIControlStateHighlighted|UIControlStateSelected)];
如果您删除了highlighted = YES
,那么您需要这样:
[button setBackgroundImage:someImage forState:(UIControlStateDisabled|UIControlStateSelected)];
了解图片?
答案 1 :(得分:30)
我有一个更简单的方法。只需使用“performSelector”,延迟为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];
}
答案 2 :(得分:27)
“开机时一切都会好转”
button.selected = !button.selected;
在将插座连接到Interface Builder中的按钮后,完美地工作。
您不需要setBackgroundImage:forState:,构建器允许您指定背景(必要时调整大小)或/和前景(不调整大小)图像。
答案 3 :(得分:27)
尝试使用NSOperationQueue来实现此目的。尝试如下代码:
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
theButton.highlighted = YES;
}];
希望这有帮助。
答案 4 :(得分:8)
使用块,这样您就不必构建一个完整的单独方法:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0), dispatch_get_main_queue(), ^{
theButton.highlighted = YES;
});
要清楚,你仍然需要为组合状态设置背景(或正常图像),以及在接受的答案中像sbrocket那样的常规状态。在某些时候,您的按钮将被选中并突出显示,除非您执行以下操作,否则您将无法获得该图像:
[button setBackgroundImage:someImage forState (UIControlStateHighlighted|UIControlStateSelected)];
否则,您的按钮可以回退到UIControlStateNormal图像以获得简短的选定+突出显示状态,您将看到闪光灯。
答案 5 :(得分:2)
在swift中,我正如以下那样做。
我创建了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
}
}
}
完美适合我。
答案 6 :(得分:1)
我有一个类似的问题,我想要一个按钮,点击后保持高亮显示。
问题是,如果您尝试在单击操作中使用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
按钮。
答案 7 :(得分:0)
我有另一种方式......如果你不想使用图像,并且想要按下按钮的效果,你可以继承按钮,这是我的代码:
<。>文件中的:
@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;
}
} `
答案 8 :(得分:0)
这是使用上述方法的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;
});
});
};