识别UIView中的滑动手势,使用手势识别器滚动scrollView

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

以下是我的代码:

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

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

编辑

其实我只是学习了一个更简单的解决scheme:只需将view.addGestureRecognizer(scrollView.panGestureRecognizer)添加到您的viewDidAppearviewDidLoad

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

所以你不需要所有的math和scrollRectToVisible如下所述。 哦,我认为了解更多关于UIScrollView的工作原理是有用的和有趣的。

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

请参阅以编程方式滚动UIScrollView以获取更多详细信息和代码语法。

基本上,在任何时候,一个UIScrollView的内容子视图是从它的框架中偏移一定的量。

它有助于理解UIScrollView(尤其是内容子视图)的各个部分,就像在这张图片中一样(可以忽略紫色的UIImageView): 在这里输入图像说明

在第一个图像中,UIScrollView的内容子视图(红色轮廓)不会从UIScrollView的框架偏移(假定与可见屏幕大小相同):它们在(0,0)处具有相同的左上angular。

在第二个/中间的图像中,UIScrollView的内容子视图现在偏移了“up”:内容子视图的左上angular现在是(0,-200),其中(0,0)仍然是UIScrollView的框架。

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

提示 :要让内容向左滚动(在用户从右向左滑动之后),您将采用UIScrollView的当前内容偏移量的x坐标( scrollView.contentOffset.x ),并减去 UIScrollView的宽度( scrollView.frame.size.width )。 因此,如果UIScrollView的当前内容偏移量(左上angular)是(0,0),则内容偏移量(左上angular)将从(0-width,0)移开,并且内容向左移动。

使滚动视图到视图的框架,但然后设置内容的插入/偏移量,所以它只能走到蓝色的框架