识别 UIView 中的滑动手势以使用手势识别器滚动滚动视图

Posted

技术标签:

【中文标题】识别 UIView 中的滑动手势以使用手势识别器滚动滚动视图【英文标题】:Recognize swipe gesture in UIView to scroll the scrollView using gesture-recognizer 【发布时间】:2017-02-17 07:24:59 【问题描述】:

我有 UIScrollView 并且滚动视图框架不等于 UIView 框架。因此,在滚动视图框架之外滑动时不会滑动滚动视图内容。但是我希望整个屏幕都响应滚动视图,尽管滚动视图不覆盖全屏。 我知道这可以通过使滚动视图框架等于视图框架来完成。但我不想这样做。我尝试了迄今为止发现的其他可能的解决方案。但没有什么能按我的意愿工作。 我需要使用手势识别器来做到这一点。

以下是我的代码:

override func viewDidLoad() 
        super.viewDidLoad()
        scrollView.delegate = self

        let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
        swipeRight.direction = UISwipeGestureRecognizerDirection.right
        self.view.addGestureRecognizer(swipeRight)


        let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
        swipeLeft.direction = UISwipeGestureRecognizerDirection.left
        self.view.addGestureRecognizer(swipeLeft)



func respondToSwipeGesture(gesture: UIGestureRecognizer) 
        if let swipeGesture = gesture as? UISwipeGestureRecognizer 
            switch swipeGesture.direction 
            case UISwipeGestureRecognizerDirection.right:

                scrollView.panGestureRecognizer.isEnabled = true

            case UISwipeGestureRecognizerDirection.left:

                 scrollView.panGestureRecognizer.isEnabled = true


            default:
                break
            
        
    

这是我的视图控制器,蓝色背景是滚动视图。滑动手势仅适用于该蓝色区域。但我希望它即使在角落也能通过屏幕工作。 如何使用手势识别器实现它

【问题讨论】:

见***.com/a/43328905/5173807 【参考方案1】:

编辑

实际上我刚刚了解了一个更简单的解决方案:只需将view.addGestureRecognizer(scrollView.panGestureRecognizer) 添加到您的viewDidAppearviewDidLoad

这实质上是采用scrollView的UIPanGestureRecognizer,一个手势识别器,可以识别手指拖动并滚动scrollView的内容,并将其提供给基本视图,以便它可以识别手指拖动和滚动scrollView 的内容。

因此,您不需要如下所述的所有数学和scrollRectToVisible。哦,好吧,我认为进一步了解 UIScrollViews 的工作原理是有用且有趣的!

要以编程方式使 UIScrollView “滚动”,请使用 UIScrollView 的 scrollRectToVisible

有关详细信息和代码语法,请参阅 Programmatically scroll a UIScrollView

基本上,在任何时间点,UIScrollView 的 内容子视图 都会从其框架中偏移一些量。

有助于理解 UIScrollView 的各个部分(尤其是内容子视图),如下图所示(请随意忽略紫色 UIImageView):

在第一张图片中,UIScrollView 的内容子视图(红色轮廓)根本没有从 UIScrollView 的框架偏移(假设与可见屏幕的大小相同):两者在 (0, 0) 处具有相同的左上角)。

在第二张/中间的图像中,UIScrollView 的内容子视图现在“向上”偏移:内容子视图的左上角现在类似于 (0, -200),其中 (0, 0) 仍然是左上角UIScrollView 框架的一角。

同样,您可以使用scrollRectToVisible 和参数animated: true 更改UIScrollView 的内容子视图偏移量,从而模拟“滚动”。

提示:例如,要让内容向左滚动(在用户从右向左滑动之后),您需要获取 UIScrollView 的当前内容偏移的 x 坐标 (scrollView.contentOffset.x) 和 减去 UIScrollView (scrollView.frame.size.width) 的宽度。所以如果 UIScrollView 的当前内容偏移量(左上角)为 (0, 0),则内容偏移量(左上角)从 (0-width, 0) 开始移动,内容向左“移动”。

【讨论】:

新方法的一个问题是现在仅在外部视图上检测到平移手势,而不是在实际滚动视图上!所以我暂时使用***.com/questions/41131986/…中提到的方法。【参考方案2】:

让你的滚动视图到视图的框架,然后设置内容插入/偏移量,这样它只会一直到蓝色框架

【讨论】:

另外,如果你想让蓝色背景只到那里,只需添加一个具有该背景颜色的 UIView 作为滚动视图的子视图,但使用旧框架(有间隙)

以上是关于识别 UIView 中的滑动手势以使用手势识别器滚动滚动视图的主要内容,如果未能解决你的问题,请参考以下文章

添加手势识别器以允许在 Swift 中的 MapView 上水平滑动

手势识别器滑动以从核心数据中删除

无法识别滑动手势

UITableview 的滑动手势

暂时禁用手势识别器滑动功能

识别视图中的滑动手势而不是子视图