我在UITableViewCell
中有一个UIButton
的子视图。
当用户触摸此按钮时,用户必须按住按钮约半秒钟,才能将按钮的图像更改为UIControlStateHighlighted
图像。
这意味着如果用户只是像通常情况下那样轻触按钮,则不会显示突出显示状态。
为什么会发生这种情况,我该如何解决?
我在UITableViewCell
中有一个UIButton
的子视图。
当用户触摸此按钮时,用户必须按住按钮约半秒钟,才能将按钮的图像更改为UIControlStateHighlighted
图像。
这意味着如果用户只是像通常情况下那样轻触按钮,则不会显示突出显示状态。
为什么会发生这种情况,我该如何解决?
我刚遇到这个问题,发现这个问题还没有解决。经过一番折腾,我找到了解决方法。
现在您可以通过关闭delaysContentTouches或取消tableview上“延迟内容触摸”框中的选择来修复此问题。
唯一的负面影响是用户将无法按下按钮并启动滚动手势。然而,如果用户尝试从任何不接受触摸的地方开始滚动,行为应该与以前相同。
问题在于您的UIButton位于UITableView内部。这意味着tableView必须确定您的点击是否为滑动手势,还是仅用于按钮的点击。tableView必须延迟发送消息到UIButton,直到它知道用户不打算滑动并因此滚动视图而不是按按钮。
如果您不需要tableView,请将其删除。
回答David Hodge的问题。
我只想补充一种方法,可以消除David已经描述的“唯一负面影响”:如果您在UIScrollView中使用delayContentTouches = NO滚动UIcontrol,则无法滚动。
解决方案 子类化UIScrollView(或UITableView作为原始问题)并覆盖:
-(BOOL) touchesShouldCancelInContentView:(UIView *)view {
return YES;
}
你在UIScrollView/UITableView里的UIControls将会立即在点击时改变它们的状态,即使触摸开始于某个UIControl,滚动视图也仍然可以滚动。效果非常好。
我只需在目标操作方法中更改图像:
[sender setBackgroundImage:[UIImage imageNamed:@"highlighted-image.png"] forState:UIControlStateNormal];
编辑:由于对问题的误解,完全重写
一种思考UIButton的方式是将其视为设置屏幕区域的速记方式,该区域可以响应各种瞬时触摸事件,它所做出的响应是由UIControl的目标-动作系统定义的,用于向其他对象传递消息。
UIControlEventTouchDown
听起来像是你需要响应的事件。只要有人在按钮内部触摸,它就会被触发 - 这就是SMS中“联系人信息”按钮所做的事情。
UIButton * myButton = [[UIButton buttonWithType:UIButtonTypeRoundedRect]; // 设置标题、框架等 [myButton addTarget:self action:@selector(myButtonWasPressed) forControlEvents: UIControlEventTouchDown]; [myMainView addSubView:myButton];
将向运行此代码的对象(理想情况下是您的视图控制器)发送-(void)myButtonWasPressed
消息。在myButtonWasPressed
中,您可以添加新视图或执行任何操作。SMS应用程序使用导航控制器推送视图控制器以显示联系人信息。
如果这仍然无法解决您的问题,您将不得不发布一些代码,以便更深入地了解出了什么问题。