Tig*_*yan 6 uiscrollview ios uipangesturerecognizer swift
我UIScrollView在中有一个UIViewController,由segue模态显示,另外一个UIPanGestureRecognizer确实通过pan关闭了视图控制器。此手势仅在以下情况下有效
scrollView.contentOffset.y == 0
Run Code Online (Sandbox Code Playgroud)
问题是,现在两个平移手势相互冲突,我无法再滚动视图。
为了解决这个问题,我尝试使用gestureRecognizer(_: shouldRecognizeSimultaneouslyWith:)方法,返回yes,并且还尝试将自定义的平移手势添加到UIScrollView平移手势识别器中,如下所示:
scrollView.panGestureRecognizer.addTarget(self, action: #selector(handlePanGesture(_:)))
Run Code Online (Sandbox Code Playgroud)
但是这些并不能解决问题。如果您知道如何解决此问题,请多多帮助。
已编辑
这是我的平移手势的代码,可消除视图控制器:
@IBAction func handlePanGesture(_ sender: UIPanGestureRecognizer) {
let percentThreshold: CGFloat = 0.3
if scrollView.contentOffset.y == 0 {
let translation = sender.translation(in: view)
let verticalMovement = translation.y / view.bounds.height
let downwardMovement = fmaxf(Float(verticalMovement), 0.0)
let downwardMovementPercent = fminf(downwardMovement, 1.0)
let progress = CGFloat(downwardMovementPercent)
guard let interactor = interactor else {return}
switch sender.state {
case .began:
interactor.hasStarted = true
dismiss(animated: true, completion: nil)
case .changed:
interactor.shouldFinish = progress > percentThreshold
interactor.update(progress)
case .cancelled:
interactor.hasStarted = false
interactor.cancel()
case .ended:
interactor.hasStarted = false
interactor.shouldFinish ? interactor.finish() : interactor.cancel()
default:
break
}
}
}
Run Code Online (Sandbox Code Playgroud)
EDITED_2
这是以下代码Interactor:
class Interactor: UIPercentDrivenInteractiveTransition {
var hasStarted = false
var shouldFinish = false
Run Code Online (Sandbox Code Playgroud)
}
附言:我知道有很多类似的问题,但它们对我不起作用。
要在 aUIPanGestureRecognizer位于 ScrollView 上时允许滚动,您需要创建一个UIGestureRecognizerDelegate返回 true 的gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:)
如果不这样做,将无法在 ScrollView 上滚动。
这是这样做的:
let scrollViewPanGesture = UIPanGestureRecognizer(target: self, action: #selector(onPan(_:)))
scrollViewPanGesture.delegate = self
scrollView.addGestureRecognizer(scrollViewPanGesture)
extension ViewController: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2866 次 |
| 最近记录: |