在顶级 UIView 上使用 UIPanGestureRecognizer 和 UITapGestureRecognizer。
Interface Builder 中的设置:
- ViewController(我们的主视图 Controller )
- UIView(我们的主视图并连接到我们的 UIViewController
- 我们的核心 UIView 有一个名为“Block”的 subview ,它只是一个 UIView。
- Block View 有 4 个 subview ( subview ),每个都是 UIButton 的一个实例。
- UIButton 将其Touch Up Inside 事件连接到 UIViewController。
- UIView(我们的主要顶级 UIView)有一个 UIPanGestureRecognizer 和一个 UITapGestureRecognizer
这是我们试图完成的场景(也称为行为):
- 用户点击一个按钮(一个单元格)。
- 该按钮会将其状态从“正常”更改为“已选择”。 (这很好用,代码也很简单)
- 对于选定的项目,用户可以将手指放在屏幕上的任意位置并向上或向下移动
问题:
- 需要知道平移何时停止。
- 顶部 UIView 没有收到表示已结束的手势。
- UIView 没有收到 touchesEnded 事件。
您如何知道用户何时抬起手指?假设我在手指悬停在 UIButton 上时开始平移,而平移发生时,UIButton 吃掉触摸开始和结束事件。因此,您无法知道用户何时停止在 iPhone/iPad 玻璃上移动手指。
最佳答案
首先在您的 View Controller 中实现 UIGestureRecognizerDelegate
。
然后将手势识别器上的委托(delegate)设置为 self 并实现以下方法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
您的目标方法应如下所示:
-(void)gestureRegognized:(UIGestureRecognizer*)gestureRecognizer
{
if ([gestureRecognizer isMemberOfClass:[UIPanGestureRecognizer class]])
{
//check its state
if(gestureRecognizer.state==UIGestureRecognizerStateBegan)
{
// add your code here
}
else if(gestureRecognizer.state==UIGestureRecognizerStateEnded)
{
// pan gesture ended code goes here
}
}
else if([gestureRecognizer isMemberOfClass:[UITapGestureRecognizer class]])
{
if(gestureRecognizer.state!=UIGestureRecognizerStateFailed)
{
// tap gesture detected
}
}
}
关于ios - UIPanGestureRecognizer 顶级 View 未获取事件, subview 使用它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23543213/