Iphone 三层平移手势识别器

Iphone 三层平移手势识别器,iphone,ios,objective-c,uigesturerecognizer,uipageviewcontroller,Iphone,Ios,Objective C,Uigesturerecognizer,Uipageviewcontroller,在开发应用程序的过程中,我遇到了一个问题,即pan手势识别器太多。 我的第一个平移手势识别器位于MainViewController上,它是RecipeSearchVC的父级。此手势识别器向左或向右滑动整个视图。 我的第二个平移手势识别器位于RecipeSearchParametersVC中,它是页面视图控制器的父级。 第三个平移手势识别器添加到由PageViewController表示的视图控制器内部嵌套的UIControl控制盘 我知道这听起来很疯狂,可以说这是一个糟糕的设计。然而,我相信,

在开发应用程序的过程中,我遇到了一个问题,即pan手势识别器太多。 我的第一个平移手势识别器位于MainViewController上,它是RecipeSearchVC的父级。此手势识别器向左或向右滑动整个视图。 我的第二个平移手势识别器位于RecipeSearchParametersVC中,它是页面视图控制器的父级。 第三个平移手势识别器添加到由PageViewController表示的视图控制器内部嵌套的UIControl控制盘

我知道这听起来很疯狂,可以说这是一个糟糕的设计。然而,我相信,如果这是一致的工作,它将是好的

当尝试旋转方向盘时,它会旋转一到两秒钟,然后PageViewController或MainViewController就会超越该手势。通常由MainViewController接管。我可以使用什么技术来清晰地区分这些手势识别器

编辑:

对于我在使用pan手势识别器时描述的模糊性,我深表歉意。 MainViewController有自己的UIPanGestureRecpgniser,允许向左或向右移动所有内容。 RecipeSearchParametersVC由于包含UIPageViewController而仅具有UIPangestureRecognitor。它不添加手势识别器本身,而只是从pageViewController中获取它们。 UIControl的手势识别器允许它跟踪它应该经历的旋转

在接受给出的建议时,我可能会删除页面视图控制器中的手势,并用按钮代替它们。我只是想让它像iBooks中的图像一样工作(可以滚动显示更多的图像),所以我认为它可以正常工作

UIControl UIPAngesture识别器代码

/**
 *  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;
}
/**
*当与给定事件相关的触摸进入控件边界时发送到控件
*
*@param touch uitouch对象,表示跟踪期间对接收控件的触摸
*@param event event对象,封装特定于用户事件的信息
*/
-(BOOL)开始触摸:(UITouch*)触摸
withEvent:(UIEvent*)事件
{
[超级开始触摸:触摸事件:事件];
CGPoint接触点=[touch locationInView:self];
//过滤掉离车轮中心太近的触摸
CGFloat震级fromcenter=[自计算标准fromcenter:接触点];
如果(震级自中心<40)返回否;
//计算距中心的距离
CGFloat deltaX=touchPoint.x-_container.center.x;
CGFloat deltaY=touchPoint.y-_container.center.y;
//计算相对(y轴)与相邻(x轴)的反正切以获得角度
_deltaAngle=atan2(deltaY,deltaX);
_startTransform=\u container.transform;
//在limbo中进行选择,通过更改当前扇区图像,将所有扇区图像设置为最小值
[self-getSectorByValue:_currentSector].alpha=kMinimumAlpha;
返回YES;
}

您需要在轮子上添加一个容器,然后您可以执行类似的操作,如果我没有遗漏某些内容,则此代码必须有效

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);
}

我相信您已经定义了3个不同的
UIPanGesture
对象,并将其附加到适当的视图中

虽然从技术上讲这是正确的,但可能会造成一些混乱,例如,如果您有多个重叠视图(这里有3个),并且需要将触摸发送到不在视图堆栈顶部的视图,会发生什么情况?这个手势最终可能会令人困惑

相反,可以将单个手势识别器附加到多个目标视图的superview,并根据用户触摸位置的坐标将手势委托给正确的视图。为此,您需要将源自任何子视图的触摸坐标规范化为定义了
UIPanGesture
的superview。这样你就能知道锅在轮子上或其他地方的位置

PS:尽管如此,我强烈感觉这是一个设计,它会伤害你。我曾经做过类似的事情,但最终你会遇到一些用户交互非常糟糕的情况。如果这是你应用程序的主要视图,我建议你重新考虑设计

我可以使用什么技术来清晰地区分这些手势识别器?

您应该研究以下方法:

询问学员是否允许两个手势识别器同时识别手势

当手势识别器或其他手势识别器对手势的识别会阻止其他手势识别器识别其手势时,调用此方法。注意,返回YES保证允许同时识别;另一方面,返回“否”不能保证阻止同时识别,因为另一个手势识别器的代理可能会返回“是”


我相信这将解决你的手势被其他手势“取代”的问题。

不幸的是,由于控制器层次结构的性质,我不得不重新思考我的应用程序的设计

带有UIPangestureRecograiser的主视图控制器保持原样。 带有UIControl的UIPageViewController已移动到单独的静态视图控制器

这样做效果更好,但还不理想。UIPageViewController窃取任何水平平移,但是这可能通过实现按钮来解决,作为滚动的替代方法

UIControl没有手势识别器,但我覆盖BeginKingWithTouch:和其他跟踪触摸的方法

我是
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer