在开发应用程序的同时,我遇到了有太多手势识别器的问题。 我的第一个平移手势识别器位于MainViewController上,它是RecipeSearchVC的父节点。此手势识别器向左或向右滑动整个视图。 我在RecipeSearchParametersVC中的第二个平移手势识别器,它是页面视图控制器的父级。 第三个平移手势手势识别器被添加到嵌套在视图控制器内部的UIControl Wheel中,该控制器由PageViewController表示。
我知道这听起来很疯狂,可以说这是糟糕的设计。但是,我相信这是有效的,它会很好。
当试图旋转滚轮时,它会在手势被PageViewController或MainViewController超越之前旋转一两秒钟。通常是MainViewController接管。我可以使用哪些技术来清楚地分离这些手势识别器?
修改
对于平移手势识别器,我的描述模糊不清。 MainViewController拥有自己的UIPanGestureRecpgniser,允许它向左或向右移动所有内容。 RecipeSearchParametersVC只有一个UIPanGestureRecogniser,因为它包含UIPageViewController。它不会添加手势识别器本身,而只是从pageViewController中获取它们。 UIControl的手势识别器允许它跟踪它应该经历的旋转。
在接受建议时,我可以从页面视图控制器中删除手势,并用按钮替换它们。我只是想让它像iBooks中的图像(可以滚动以显示更多图像)一样工作,所以我认为它会正常工作。
UIControl UIPanGestureRecogniser代码
/**
* sent to the control when a touch related to the given event enters the control’s bounds
*
* @param touch uitouch object that represents a touch on the receiving control during tracking
* @param event event object encapsulating the information specific to the user event
*/
- (BOOL)beginTrackingWithTouch:(UITouch *)touch
withEvent:(UIEvent *)event
{
[super beginTrackingWithTouch:touch withEvent:event];
CGPoint touchPoint = [touch locationInView:self];
// filter out touchs too close to centre of wheel
CGFloat magnitudeFromCentre = [self calculateDistanceFromCentre:touchPoint];
if (magnitudeFromCentre < 40) return NO;
// calculate distance from centre
CGFloat deltaX = touchPoint.x - _container.center.x;
CGFloat deltaY = touchPoint.y - _container.center.y;
// calculate the arctangent of the opposite (y axis) over the adjacent (x axis) to get the angle
_deltaAngle = atan2(deltaY, deltaX);
_startTransform = _container.transform;
// selection in limbo so set all sector image's to minimum value by changing current one
[self getSectorByValue:_currentSector].alpha = kMinimumAlpha;
return YES;
}
答案 0 :(得分:2)
不幸的是,由于我的控制器层次结构的性质,我不得不重新考虑我的应用程序的设计。
带有UIPanGestureRecogniser的MainViewController保持原样。 带有UIControl的UIPageViewController已移至单独的静态视图控制器。
这种方法效果更好,但还不理想。 UIPageViewController会窃取任何水平平移,但是这可以通过实现按钮作为滚动的替代方法来修复。
UIControl没有手势识别器,但是我覆盖了beginTrackingWithTouch:和其他跟踪触摸的方法。
我认为答案应该是:如果你分层的手势太多,你做错了。
答案 1 :(得分:0)
您需要在方向盘上添加一个容器,然后您可以执行类似的操作,如果我没有遗漏某些内容,则此代码必须正常工作。
UIPanGestureRecognizer* pan1 = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan1:)];
[self.view addGestureRecognizer:pan1];
UIPanGestureRecognizer* pan2 = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan2:)];
[view2 addGestureRecognizer:pan2];
UIPanGestureRecognizer* pan3 = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan3:)];
[view3 addGestureRecognizer:pan3];
- (void) pan1:(UIPanGestureRecognizer*)sender{
NSLog(@"%@",sender);
}
- (void) pan2:(UIPanGestureRecognizer*)sender{
NSLog(@"%@",sender);
}
- (void) pan3:(UIPanGestureRecognizer*)sender{
NSLog(@"%@",sender);
}
答案 2 :(得分:0)
我相信您会定义3个不同的UIPanGesture
个对象并将其附加到相应的视图中。
虽然技术上这是正确的,但它可能会引起一些混乱,例如,如果你有几个重叠的视图(这里有3个)并且需要触摸发送到不在视图堆栈顶部的视图会发生什么?这种姿态可能会让人感到困惑。
相反,可以将单个手势识别器附加到多个目标视图的超视图,并根据用户触摸的位置坐标将手势委托给正确的视图。为此,您需要将源自任何子视图的触摸坐标标准化为定义UIPanGesture
的超级视图。这样你就可以知道平底锅在车轮上或其他地方发生的位置。
答案 3 :(得分:0)
我可以采用哪些技巧来清楚地区分每个手势识别器?
您应该查看UIGestureRecognizerDelegate方法:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
询问代表是否应允许两个手势识别器同时识别手势。
当gestureRecognizer或otherGestureRecognizer识别手势会阻止其他手势识别器识别其手势时,会调用此方法。请注意,保证返回YES可以同时识别;另一方面,返回NO不能保证防止同时识别,因为其他手势识别器的代表可能会返回YES。
我相信这会解决你的手势被其他手势“超越”的问题。