UIButton延迟了状态变化

19 iphone

我有一个UIButton子视图UITableViewCell.

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

这意味着如果用户只是按照通常的情况点击按钮,则不会显示突出显示的状态.

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

Dav*_*dge 25

我刚刚遇到这个问题,发现此问题尚未解决.拧了一会儿后,我找到了解决方法.

现在,您可以通过关闭延迟内容套餐或取消选中桌面视图上的"延迟内容触摸"框来解决此问题.

唯一的负面影响是用户将无法点击按钮并启动滚动手势.但是,如果用户尝试从本身不接受触摸的任何地方开始滚动,则行为应与以前相同.


Don*_*nit 11

大卫霍奇的回答.

我只是想添加一种方法来消除David已经描述过的"唯一的负面影响":如果你开始在带有delayContentTouches = NO的UIScrollView中的UIcontrol内滚动,则滚动不起作用.

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

-(BOOL) touchesShouldCancelInContentView:(UIView *)view {   
return YES; 
}
Run Code Online (Sandbox Code Playgroud)

您在UIScrollView/UITableView中的UIControl将立即更改其状态,即使在某些UIControl上启动触摸,滚动视图也可以滚动.奇迹般有效.


luc*_*ius 10

问题是您的UIButton位于UITableView中.这意味着表格视图必须确定您的点按是否将是滑动,或者它是否只是用于按钮的点击.表视图必须延迟向UIButton发送消息,直到它知道用户不打算滑动,因此滚动视图而不是按下按钮.

如果您不需要表视图,请删除UITableView.


Rog*_*Rog 0

编辑:在对问题的误解之后完全重写

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

UIControlEventTouchDown听起来像是你需要回应的人。一旦有人触摸您的按钮内部,它就会被触发 - 这就是短信中的“联系信息”按钮的作用。

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

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

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