触摸后保持选择UIButton

Gre*_*tic 89 selected uibutton ios

在我的用户单击按钮后,我希望该按钮在执行网络操作期间保持推送状态.网络操作完成后,我希望按钮返回其默认状态.

我试过调用 - [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;
}
Run Code Online (Sandbox Code Playgroud)

Bry*_*nry 73

如何为UIControlStates按钮上的不同设置图像?你设置的背景图像UIControlStateHighlighted,以及UIControlStateSelected

UIImage *someImage = [UIImage imageNamed:@"SomeResource.png"];
[button setBackgroundImage:someImage forState:UIControlStateHighlighted];
[button setBackgroundImage:someImage forState:UIControlStateSelected];
Run Code Online (Sandbox Code Playgroud)

如果您在按钮触摸事件而不是在内部触摸上设置所选状态,则您的按钮实际上将处于突出显示的+选定状态,因此您也需要设置该状态.

[button setBackgroundImage:someImage forState:(UIControlStateHighlighted|UIControlStateSelected)];
Run Code Online (Sandbox Code Playgroud)

编辑:

总结我在评论中的评论并解决您发布的代码......您需要为您所处的完整UIControl状态设置背景图像.根据您的代码片段,此控件状态将被禁用+选择+突出显示网络操作的持续时间.这意味着您需要这样做:

[button setBackgroundImage:someImage forState:(UIControlStateDisabled|UIControlStateHighlighted|UIControlStateSelected)];
Run Code Online (Sandbox Code Playgroud)

如果你删除了highlighted = YES,那么你需要这个:

[button setBackgroundImage:someImage forState:(UIControlStateDisabled|UIControlStateSelected)];
Run Code Online (Sandbox Code Playgroud)

得到图片?


Hlu*_*ung 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];
}
Run Code Online (Sandbox Code Playgroud)


184*_*615 27

"打开电源后一切都会变得更好"

    button.selected = !button.selected;
Run Code Online (Sandbox Code Playgroud)

在将插座连接到Interface Builder中的按钮后,工作完美.

您不需要setBackgroundImage:forState:,构建器允许您指定背景(必要时调整大小)或/和前景(不调整大小)图像.


rob*_*tti 27

尝试使用NSOperationQueue来实现这一目标.尝试如下代码:

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    theButton.highlighted = YES;
}];
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


Bob*_*ryn 8

使用块,这样您就不必构建一个完整的单独方法:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0), dispatch_get_main_queue(), ^{
    theButton.highlighted = YES;
});
Run Code Online (Sandbox Code Playgroud)

更新

为了清楚起见,你仍然需要为组合状态设置背景(或正常图像),以及在接受的答案中像sbrocket那样的常规状态.在某些时候,您的按钮将被选中并突出显示,除非您执行以下操作,否则您将无法获得该图像:

[button setBackgroundImage:someImage forState (UIControlStateHighlighted|UIControlStateSelected)];
Run Code Online (Sandbox Code Playgroud)

否则,您的按钮可以回退到UIControlStateNormal图像以获得简短的选定+突出显示状态,您将看到闪光灯.