UIButton延迟状态改变

20

我在UITableViewCell中有一个UIButton的子视图。

当用户触摸此按钮时,用户必须按住按钮约半秒钟,才能将按钮的图像更改为UIControlStateHighlighted图像。

这意味着如果用户只是像通常情况下那样轻触按钮,则不会显示突出显示状态。

为什么会发生这种情况,我该如何解决?


这只是出于好奇,这是在模拟器还是设备上? - Frank Schmitt
5个回答

25

我刚遇到这个问题,发现这个问题还没有解决。经过一番折腾,我找到了解决方法。

现在您可以通过关闭delaysContentTouches或取消tableview上“延迟内容触摸”框中的选择来修复此问题。

唯一的负面影响是用户将无法按下按钮并启动滚动手势。然而,如果用户尝试从任何不接受触摸的地方开始滚动,行为应该与以前相同。


我花了大约8个小时来寻找这个问题的解决方案。非常感谢。 - Max Hudson
我在UIScrollView上使用UIButton时遇到了同样的问题。这个方法解决了它。 - Jay Q.
UIScrollView设置示例代码:scrollView.delaysContentTouches = NO; - Gabriel Jensen

11

问题在于您的UIButton位于UITableView内部。这意味着tableView必须确定您的点击是否为滑动手势,还是仅用于按钮的点击。tableView必须延迟发送消息到UIButton,直到它知道用户不打算滑动并因此滚动视图而不是按按钮。

如果您不需要tableView,请将其删除。


我也遇到了这个问题,我唯一对这个评论的问题是使用另一个控件,如UISwitch,不会产生这样的延迟。 - d2burke
伙计,这个解释真是太棒了,谢谢你救了我的一天! - Konstantin Nikolskii

11

回答David Hodge的问题。

我只想补充一种方法,可以消除David已经描述的“唯一负面影响”:如果您在UIScrollView中使用delayContentTouches = NO滚动UIcontrol,则无法滚动。

解决方案 子类化UIScrollView(或UITableView作为原始问题)并覆盖:

-(BOOL) touchesShouldCancelInContentView:(UIView *)view {   
return YES; 
}

你在UIScrollView/UITableView里的UIControls将会立即在点击时改变它们的状态,即使触摸开始于某个UIControl,滚动视图也仍然可以滚动。效果非常好。


3

我只需在目标操作方法中更改图像:

[sender setBackgroundImage:[UIImage imageNamed:@"highlighted-image.png"] forState:UIControlStateNormal];

它会立即改变背景图像。

0

编辑:由于对问题的误解,完全重写

一种思考UIButton的方式是将其视为设置屏幕区域的速记方式,该区域可以响应各种瞬时触摸事件,它所做出的响应是由UIControl的目标-动作系统定义的,用于向其他对象传递消息。

UIControlEventTouchDown听起来像是你需要响应的事件。只要有人在按钮内部触摸,它就会被触发 - 这就是SMS中“联系人信息”按钮所做的事情。

UIButton * myButton = [[UIButton buttonWithType:UIButtonTypeRoundedRect]; // 设置标题、框架等 [myButton addTarget:self action:@selector(myButtonWasPressed) forControlEvents: UIControlEventTouchDown]; [myMainView addSubView:myButton];

将向运行此代码的对象(理想情况下是您的视图控制器)发送-(void)myButtonWasPressed消息。在myButtonWasPressed中,您可以添加新视图或执行任何操作。SMS应用程序使用导航控制器推送视图控制器以显示联系人信息。

如果这仍然无法解决您的问题,您将不得不发布一些代码,以便更深入地了解出了什么问题。


我认为你误解了。 例如,如果您查看短信应用程序,则消息线程顶部的图标会立即对触摸做出反应。 我的意思是说,我的按钮没有显示出高亮状态的即时反应。 我不希望用户按住按钮。 我希望他们正常使用按钮,但是按钮的状态会随着预期而改变并反映在按钮的视觉外观中。 - UIView
好的,还有一个误解 :)我的按钮的操作或事件没有任何问题。要重新创建我所描述的内容,只需创建一个新的UITableViewCell,并将UIButton作为其子视图添加:即[cell.contentView addSubview:button]。然后在设备上进行测试。当您触摸按钮时,操作将正确触发,但是按钮的高亮状态不会立即发生。相反,您必须按住按钮半秒钟才能看到按钮在视觉上更改状态。我所说的只是按钮的视觉外观。 - UIView

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接