UIPanGestureRecognizer 的问题

Posted

技术标签:

【中文标题】UIPanGestureRecognizer 的问题【英文标题】:Problems with UIPanGestureRecogniser 【发布时间】:2011-11-29 13:53:05 【问题描述】:

使用 XCode 4.2 并尝试掌握 UIGestureRecognisers。到目前为止,一切似乎都进展顺利,但仍有一些问题。

当我使用滑动手势识别器时,一切都很好,它可以识别所有不同方向的滑动,并且会连续识别。我现在的问题是,当使用平移手势识别器时,它可以很好地识别第一次平移滑动,但随后拒绝接受任何进一步的手势。所以我可以根据需要移动大约一次,但之后就什么也做不了了。

我的手势设置如下:

UIPanGestureRecognizer *panBody = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panBody:)];
[bodyGestureView addGestureRecognizer:panBody];

那么这是我的“panBody”方法来处理这一切:

- (void)panBody:(UIPanGestureRecognizer *)recognizer

CGPoint translate = [recognizer translationInView:self.view];

CGRect bodyPanelFrame = bodyPanel.frame;
bodyPanelFrame.origin.x += translate.x;
bodyPanelFrame.origin.y += translate.y;
recognizer.view.frame = bodyPanelFrame;

CGRect topPanelFrame = topPanel.frame;
topPanelFrame.origin.x += translate.x;
topPanelFrame.origin.y += translate.y;
recognizer.view.frame = topPanelFrame;

CGRect sidePanelFrame = sidePanel.frame;
sidePanelFrame.origin.x += translate.x;
sidePanelFrame.origin.y += translate.y;
recognizer.view.frame = sidePanelFrame;

NSLog(@"Panning");

if (recognizer.state == UIGestureRecognizerStateEnded)

    bodyPanel.frame = bodyPanelFrame;

    if((topPanel.frame.origin.x + translate.x) <= 193)
    
        topPanel.frame = CGRectMake(topPanelFrame.origin.x, topPanel.frame.origin.y, topPanel.frame.size.width, topPanel.frame.size.height);
    
    else
    
        topPanel.frame = CGRectMake(193, 0, topPanel.frame.size.width, topPanel.frame.size.height);
        NSLog(@"Top panel not in frame");
    

    if((sidePanel.frame.origin.y + translate.y) < 57)
    
        sidePanel.frame = CGRectMake(sidePanel.frame.origin.x, sidePanelFrame.origin.y, sidePanel.frame.size.width, sidePanel.frame.size.height);
    
    else
    
        sidePanel.frame = CGRectMake(0, 56, sidePanel.frame.size.width, sidePanel.frame.size.height);
        NSLog(@"Side panel not in frame");
    


bodyPanel、topPanel 和 sidePanel 是链接到 UIView 的 IBOutlets,覆盖在我的界面 .xib 的顶部

如果有人能对这些信息有所了解,那就太好了,因为我完全不知道发生了什么!

谢谢,

马特

【问题讨论】:

【参考方案1】:

首先我会检查一下

if (recognizer.state == UIGestureRecognizerStateChanged)

在进行翻译之前(还有许多其他可能的状态不能证明您采取任何行动是正当的)。此外,如果您使用 UIPanGestureRecognizer 方法累积它们,我会在每次回调时重置翻译

- (void)setTranslation:(CGPoint)translation inView:(UIView *)view

如果手势识别器停止,则可能是另一个手势识别器正在干扰它。你那里还有一个活跃的 UISwipeGestureRecognizer 吗?如果是这样,您可能应该停用其中之一。这个方法也可以看看

- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer

它允许您指定应优先考虑哪个识别器。

【讨论】:

以上是关于UIPanGestureRecognizer 的问题的主要内容,如果未能解决你的问题,请参考以下文章

UIPanGestureRecognizer 碰撞

如何在父视图中限制 UIPanGestureRecognizer

UIPanGestureRecognizer 干扰滚动

未调用 iOS 13 UIPanGestureRecognizer 选择器

Swift:获取 UIPanGestureRecognizer 的目标

当对象移动到某个帧时如何停止 UIPanGestureRecognizer