当我将 A UIPangesturerecognizer 添加到 UIScrollView 时,滚动被禁用

Posted

技术标签:

【中文标题】当我将 A UIPangesturerecognizer 添加到 UIScrollView 时,滚动被禁用【英文标题】:Scrolling is disabled when i add A UIPangesturerecognizer to UIScrollView 【发布时间】:2012-02-04 09:00:56 【问题描述】:

我有一个滚动视图,我想让它在平移完成时消失。 它工作正常,在平移时,滚动视图消失,但问题是现在我无法滚动内容。

[UIView animateWithDuration:0.2
                      delay:0.2
                    options: UIViewAnimationCurveLinear
                 animations:^
                     slideView.frame=CGRectMake(268, 0, 500, 950);
                     curtain.frame=CGRectMake(0, 0, 268, 950);
                     curtain.backgroundColor=[[UIColor alloc]initWithRed:0 green:0 blue:0 alpha:0.6];
                     [self.view addSubview:slideView];
                    [self.view addSubview:curtain];

                  
                 completion:^(BOOL finished)
                     NSLog(@"Done!");
                 ];

这就是我如何让我的 uiscrollview 出现(幻灯片视图是滚动视图)。然后我添加一个 pangesturerecognizer。一切正常,但滚动被禁用。 (panImage 再次隐藏了我的幻灯片视图。)如何使滚动工作.??

[slideView addGestureRecognizer:panImage];

【问题讨论】:

【参考方案1】:

UIScrollView 有自己的平移手势识别器,用于控制滚动。通过添加另一个平移手势识别器,您将阻止滚动视图自己的平移手势识别器工作。

有很多方法可以解决这个问题,但如果您能解释系统应该如何知道用户何时尝试关闭滚动视图以及何时尝试滚动,将会很有帮助,因为你想要一个平移手势来做这两件事。

例如,您可以设置两个手势识别器的委托以允许识别器同时操作(通过覆盖gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: 方法)。您可以使每个手势识别器需要不同的触摸次数(通过设置minimumNumberOfTouchesmaximumNumberOfTouches 属性)。您可以使用UISwipeGestureRecognizer 来识别解除手势。您可以通过覆盖滚动视图委托的scrollViewDidScroll: 方法来检测用户何时尝试滚动超出滚动视图的左边缘。

【讨论】:

您必须同时识别多个手势,但您还需要在处理手势时禁用滚动。见@miroslav。【参考方案2】:

您可以手动设置 panGestureRecognizers 的优先级。 这就是我解决相同问题的方法:在委托 (BOOL)gestureRecognizerShouldBegin: 如果它应该返回 YES,我在我的 scrollView 中禁用滚动。在我的 panGestureRecognizer 选择器的开头,我启用了滚动。

在此委托中,您可以创建 panGestureRecognizer 的条件以启用这种方式,当且仅当您希望它具有主要优先级时它才会起作用。

【讨论】:

【参考方案3】:

快速方法, 需要将 UIGestureRecognizerDelegate 添加到您的班级:

class ViewController: UIViewController, UIGestureRecognizerDelegate 

需要将其委托设置为自身:

override func viewDidLoad() 
    super.viewDidLoad()
    var scrollView = UIScrollView(frame: self.view.frame)
    scrollView.delegate = self

将此部分添加到您的类方法中以激活同时手势:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool 
    return true

【讨论】:

【参考方案4】:

当我在 scrollView 顶部有一个视图时,我需要添加一个手势识别器以便在视图中滚动它,我做了这样的事情(放置在 viewDidAppear 方法中):

  hostedView.addGestureRecognizer(scrollView.panGestureRecognizer)

【讨论】:

以上是关于当我将 A UIPangesturerecognizer 添加到 UIScrollView 时,滚动被禁用的主要内容,如果未能解决你的问题,请参考以下文章

我创建了 lib.a 文件并添加了一些类、资源和图像。当我将此 lib 文件与头文件一起使用时,它会给出异常

当我将它链接到我的 Makefile 中时,我可以从 lib 中修剪一些模块吗?

当我将一个字典分配给另一个变量时,为啥 Python 会同时更新两个字典? [复制]

当我将 print_r() 应用于 PHP 中的数组时,为啥会得到“资源 id #4”? [复制]

为啥当我将熊猫数据框用作具有多处理功能的函数的输入时它不会改变

为啥当我将其大小初始化为 5 并且只给出 5 个元素时,向量的大小会增加到 10?