使用手势识别器识别 UIView 中的滑动手势以滚动 scrollView
Recognize swipe gesture in UIView to scroll the scrollView using gesture-recognizer
我有 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
}
}
}
这是我的视图控制器,蓝色背景是滚动视图。滑动手势仅适用于该蓝色区域。但我希望它即使在角落也能通过屏幕工作。 如何使用手势识别器实现它?
将滚动视图滚动到视图的框架,然后设置内容 inset/offset,使其只滚动到蓝色框架
编辑
实际上我刚刚了解到一个更简单的解决方案:只需将 view.addGestureRecognizer(scrollView.panGestureRecognizer)
添加到您的 viewDidAppear
或 viewDidLoad
。
这实际上是获取 scrollView
的 UIPanGestureRecognizer,一个识别手指拖动和滚动 scrollView
内容的手势识别器,并将其提供给 base view 以便它可以识别手指拖动并滚动 scrollView
的内容。
所以您不需要所有的数学和 scrollRectToVisible
如下所述。哦,好吧,我认为了解更多关于 UIScrollViews 的工作原理是有用和有趣的!
旧
要以编程方式制作 UIScrollView "scroll",请使用 UIScrollView 的 scrollRectToVisible
。
有关详细信息和代码语法,请参阅 Programmatically scroll a UIScrollView。
基本上,在任何时间点,UIScrollView 的 内容子视图 都会从其框架偏移一些量。
它有助于理解 UIScrollView 的各个部分(尤其是内容子视图),就像这张图片(随意忽略紫色的 UIImageView):
在第一张图片中,UIScrollView 的内容子视图(红色轮廓)根本没有从 UIScrollView 的框架(假设与可见屏幕大小相同)偏移:两者在 (0) 处具有相同的左上角, 0).
在 second/middle 图像中,UIScrollView 的内容子视图现在偏移 "up":内容子视图的左上角现在位于类似 (0, -200) 的位置,其中 (0, 0 ) 仍然是 UIScrollView 框架的左上角。
同样,您可以更改 UIScrollView 的内容子视图偏移量,从而使用 scrollRectToVisible
和参数 animated: true
模拟一个 "scroll"。
提示:例如,要使内容向左滚动(在用户从右向左滑动之后),您将使用 UIScrollView 的当前内容偏移量的 x 坐标(scrollView.contentOffset.x
) 和 减去 UIScrollView (scrollView.frame.size.width
) 的宽度。所以如果UIScrollView的当前内容偏移量(左上角)为(0, 0),则内容偏移量(左上角)从(0-width, 0)开始移动,内容"moves"向左移动。
我有 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
}
}
}
这是我的视图控制器,蓝色背景是滚动视图。滑动手势仅适用于该蓝色区域。但我希望它即使在角落也能通过屏幕工作。 如何使用手势识别器实现它?
将滚动视图滚动到视图的框架,然后设置内容 inset/offset,使其只滚动到蓝色框架
编辑
实际上我刚刚了解到一个更简单的解决方案:只需将 view.addGestureRecognizer(scrollView.panGestureRecognizer)
添加到您的 viewDidAppear
或 viewDidLoad
。
这实际上是获取 scrollView
的 UIPanGestureRecognizer,一个识别手指拖动和滚动 scrollView
内容的手势识别器,并将其提供给 base view 以便它可以识别手指拖动并滚动 scrollView
的内容。
所以您不需要所有的数学和 scrollRectToVisible
如下所述。哦,好吧,我认为了解更多关于 UIScrollViews 的工作原理是有用和有趣的!
旧
要以编程方式制作 UIScrollView "scroll",请使用 UIScrollView 的 scrollRectToVisible
。
有关详细信息和代码语法,请参阅 Programmatically scroll a UIScrollView。
基本上,在任何时间点,UIScrollView 的 内容子视图 都会从其框架偏移一些量。
它有助于理解 UIScrollView 的各个部分(尤其是内容子视图),就像这张图片(随意忽略紫色的 UIImageView):
在第一张图片中,UIScrollView 的内容子视图(红色轮廓)根本没有从 UIScrollView 的框架(假设与可见屏幕大小相同)偏移:两者在 (0) 处具有相同的左上角, 0).
在 second/middle 图像中,UIScrollView 的内容子视图现在偏移 "up":内容子视图的左上角现在位于类似 (0, -200) 的位置,其中 (0, 0 ) 仍然是 UIScrollView 框架的左上角。
同样,您可以更改 UIScrollView 的内容子视图偏移量,从而使用 scrollRectToVisible
和参数 animated: true
模拟一个 "scroll"。
提示:例如,要使内容向左滚动(在用户从右向左滑动之后),您将使用 UIScrollView 的当前内容偏移量的 x 坐标(scrollView.contentOffset.x
) 和 减去 UIScrollView (scrollView.frame.size.width
) 的宽度。所以如果UIScrollView的当前内容偏移量(左上角)为(0, 0),则内容偏移量(左上角)从(0-width, 0)开始移动,内容"moves"向左移动。