在另一个视图中滚动 UIScrollView 时滚动速度更快
Scroll UIScrollView faster when scrolling it through another view
我有一张 UIScrollView
的大 UIImageView
图像,分辨率非常高(大约 10,000 x 10,000)。在此 UIImageView
中启用了缩放和滚动。我还有一个较小的 UIImageView
,具有相同的图像,但分辨率要小得多(大约 100 x 100)。我在较小的 UIImageView
上显示较大 UIImageView
的可见部分。并且用户可以通过在较小 UIImageView
上平移来导航到较大 UIImageView
上的其他地方。下图显示了我要解释的内容。我的问题是在较小的 UIImageView 上平移时,在较大的 UIScrollView 中滚动真的很慢。
// function that handles the pan on green view
func handlePanNavigation(gestureRecognizer: UIPanGestureRecognizer) {
if gestureRecognizer.state == .began || gestureRecognizer.state == .changed {
let translation = gestureRecognizer.translation(in: navigationPanel)
guard let gv = gestureRecognizer.view else { return }
let point = CGPoint(x: gv.center.x + translation.x, y: gv.center.y + translation.y)
gestureRecognizer.view?.center = point
gestureRecognizer.setTranslation(.zero, in: navigationPanelView)
let transform = CGAffineTransform(scaleX: orgSize.width*tiledScrollView.zoomScale/navSize.width, y: orgSize.height*tiledScrollView.zoomScale/navSize.height)
let offset = navigationPanelView.frame.origin.applying(transform)
tiledScrollView.setContentOffset(offset, animated: true)
}
}
您不应在实时应用用户输入转换时对内容偏移的变化进行动画处理,因为这很容易减慢反馈速度。
改变
tiledScrollView.setContentOffset(offset, animated: true)
至
tiledScrollView.setContentOffset(offset, animated: false)
我不完全确定你要如何完成此操作,但如果你想减慢或加快平移手势转换,请添加一个乘数。
switch gesture.state {
case .began:
gesture.setTranslation(CGPoint.zero, in: gesture.view)
case .changed:
gesture.setTranslation(CGPoint.zero, in: gesture.view)
if someView.frame.origin.y < someThreshold {
someView.center = CGPoint(x: someView.center.x, y: someView.center.y + (translation.y * 0.25))
}
...
在这里,超过 someThreshold
的任何向上平移都会慢 4 倍。在你的情况下,显然,添加一个大于 1 的乘数。
我有一张 UIScrollView
的大 UIImageView
图像,分辨率非常高(大约 10,000 x 10,000)。在此 UIImageView
中启用了缩放和滚动。我还有一个较小的 UIImageView
,具有相同的图像,但分辨率要小得多(大约 100 x 100)。我在较小的 UIImageView
上显示较大 UIImageView
的可见部分。并且用户可以通过在较小 UIImageView
上平移来导航到较大 UIImageView
上的其他地方。下图显示了我要解释的内容。我的问题是在较小的 UIImageView 上平移时,在较大的 UIScrollView 中滚动真的很慢。
// function that handles the pan on green view
func handlePanNavigation(gestureRecognizer: UIPanGestureRecognizer) {
if gestureRecognizer.state == .began || gestureRecognizer.state == .changed {
let translation = gestureRecognizer.translation(in: navigationPanel)
guard let gv = gestureRecognizer.view else { return }
let point = CGPoint(x: gv.center.x + translation.x, y: gv.center.y + translation.y)
gestureRecognizer.view?.center = point
gestureRecognizer.setTranslation(.zero, in: navigationPanelView)
let transform = CGAffineTransform(scaleX: orgSize.width*tiledScrollView.zoomScale/navSize.width, y: orgSize.height*tiledScrollView.zoomScale/navSize.height)
let offset = navigationPanelView.frame.origin.applying(transform)
tiledScrollView.setContentOffset(offset, animated: true)
}
}
您不应在实时应用用户输入转换时对内容偏移的变化进行动画处理,因为这很容易减慢反馈速度。
改变
tiledScrollView.setContentOffset(offset, animated: true)
至
tiledScrollView.setContentOffset(offset, animated: false)
我不完全确定你要如何完成此操作,但如果你想减慢或加快平移手势转换,请添加一个乘数。
switch gesture.state {
case .began:
gesture.setTranslation(CGPoint.zero, in: gesture.view)
case .changed:
gesture.setTranslation(CGPoint.zero, in: gesture.view)
if someView.frame.origin.y < someThreshold {
someView.center = CGPoint(x: someView.center.x, y: someView.center.y + (translation.y * 0.25))
}
...
在这里,超过 someThreshold
的任何向上平移都会慢 4 倍。在你的情况下,显然,添加一个大于 1 的乘数。