触摸后保持 UIButton 处于选中状态
用户单击按钮后,我希望在执行网络操作期间该按钮保持按下状态。当网络操作完成后,我希望按钮返回到默认状态。
我尝试在按下按钮后立即调用 -[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;
}
After my user clicks a button, I'd like that button to stay pushed during the time that I perform a network operation. When the network operation is complete, I want the button to return to its default state.
I've tried calling -[UIButton setSelected:YES]
right after the button push (with a corresponding call to -[UIButton setSelected:NO]
after my network op finishes) but it doesn't seem to do anything. Same thing if I call setHighlighted:
.
I suppose I could try swapping out the background image to denote a selected state for the duration of the network op, but that seems like a hack. Any better suggestions?
Here's what my code looks like:
- (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;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
如何为按钮上的不同
UIControlStates
设置图像?您是否为UIControlStateHighlighted
和UIControlStateSelected
设置背景图像?如果您在按钮触摸事件上设置选定状态而不是在内部触摸,则您的按钮实际上将处于突出显示+选定状态,因此您也需要进行设置。
编辑:
为了总结我在评论中的评论并解决您发布的代码...您需要为您所处的完整
UIControl
状态设置背景图像。根据您的代码片段,在网络操作期间,该控制状态将被禁用+选择+突出显示。这意味着您需要执行以下操作:如果删除
highlighted = YES
,那么您将需要执行以下操作:获取图片?
How are you setting the images for the different
UIControlStates
on the button? Are you setting a background image forUIControlStateHighlighted
as well asUIControlStateSelected
?If you're setting the selected state on the button touch down event rather than touch up inside, your button will actually be in a highlighted+selected state, so you'll want to set that too.
Edit:
To sum up my remarks in the comments and to address the code you posted...you need to set your background images for the full
UIControl
state that you're in. According to your code snippet, this control state would be disabled + selected + highlighted for the duration of the network operation. This means that you would need to do this:If you remove the
highlighted = YES
, then you would need this:Get the picture?
我有一个更简单的方法。只需使用“performSelector”以 0 延迟执行
[button setHighlighted:YES]
。这将在当前运行循环结束后执行重新突出显示。I have an easier way. Just use "performSelector" with 0 delay to perform
[button setHighlighted:YES]
. This will perform re-highlighting after the current runloop ends.“打开电源时一切都会变得更好”
在我将插座连接到 Interface Builder 中的按钮后,
效果完美。您不需要 setBackgroundImage:forState:,构建器允许您指定背景(必要时调整大小)或/和前景(不调整大小)图像。
"Everything gets better when you turn power on"
works perfectly... after I connected the outlet to the button in the Interface Builder.
You do not need to setBackgroundImage:forState:, the builder allows you to specify the background (gets resized if necessary) or/and foreground (not resizing) images.
尝试使用 NSOperationQueue 来实现这一点。尝试如下代码:
希望这有帮助。
Try using NSOperationQueue to achieve this. Try out code as follows:
Hope this helps.
使用块,这样您就不必构建一个完整的单独方法:
更新
为了清楚起见,您仍然需要为组合状态以及常规状态(如 sbrocket 在接受的答案中所说)设置背景(或正常图像)。在某些时候,您的按钮将被选中并突出显示,除非您执行以下操作,否则您将不会有图像:
否则您的按钮可以回退到 UIControlStateNormal 图像以实现短暂的选定+突出显示状态,并且您将看到闪光。
Use a block so you don't have to build a whole separate method:
Update
To be clear you still need to set the background (or normal image) for the combination states as well as the regular ones like sbrocket says in the accepted answer. At some point your button will be both selected and highlighted, and you won't have an image for that unless you do something like this:
Otherwise your button can fall back to the UIControlStateNormal image for the brief selected+highlighted state and you'll see a flash.
我很快就这样做了,如下所示。
我创建了
UIButton
的子类并实现了自定义属性state
非常适合我。
In swift I'm doing it like the following.
I create a Subclass of
UIButton
and implemented a custom propertystate
Works perfectly for me.
我遇到了类似的问题,我想要一个按钮在单击后保持其突出显示。
问题是,如果您尝试在单击操作内使用
setHighlighted:YES
,它将在您单击操作后立即重置,- (IBAction)checkInButtonPushed
我通过使用解决了这个问题NSTimer 像这样
,然后从我的
selectCurrentIndex
方法调用setHighlighted:YES
。我使用常规的 UIButtonTypeRoundedRect 按钮。I had a similar problem where I wanted a button to keep it's highlight after click.
The problem is if you try to use
setHighlighted:YES
inside of you click action it will reset right after you click action,- (IBAction)checkInButtonPushed
I solved this by using a NSTimer like this
and then call
setHighlighted:YES
from myselectCurrentIndex
method. I use regularUIButtonTypeRoundedRect
buttons.我还有另一种方法...如果您不想使用图像,并且想要按下按钮的效果,您可以对 Button 进行子类化,这是我的代码:
在 .h 文件中:
在 .m 文件中:
I have another way ...if you don't want to use images, and you want the effect of a pressed button, You can subclass the Button and here's my code:
in the .h File:
In the .m File:
下面是使用上述方法的 C#/MonoTouch (Xamarin.iOS) 实现。它假设您已经设置了突出显示图像状态,并将选定状态和选定|突出显示状态配置为使用相同的图像。
Here is a C# / MonoTouch (Xamarin.iOS) implementation using approaches presented above. It assumes you have set the Highlighted image state already, and configures the selected and selected|highlighted states to use the same image.