【发布时间】:2018-01-28 21:48:12
【问题描述】:
我在UIViewController 中有一个UIScrollView,它通过segue 模态显示,另外一个UIPanGestureRecognizer 通过平移关闭视图控制器。此手势仅在
scrollView.contentOffset.y == 0
问题是,现在两个平移手势相互冲突,我无法再滚动视图。
为了解决这个问题,我尝试使用gestureRecognizer(_: shouldRecognizeSimultaneouslyWith:) 方法,返回是,并且我尝试将自定义平移手势添加到UIScrollView 平移手势识别器,如下所示:
scrollView.panGestureRecognizer.addTarget(self, action: #selector(handlePanGesture(_:)))
但这些并不能解决问题 如果您知道如何解决此问题,我将不胜感激。
已编辑
以下是我的平移手势关闭视图控制器的代码:
@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
}
}
}
EDITED_2
这是Interactor的代码:
class Interactor: UIPercentDrivenInteractiveTransition {
var hasStarted = false
var shouldFinish = false
}
附:我知道有很多类似的问题,但它们对我不起作用。
【问题讨论】:
-
如果您使用
UINavigationController,它应该会自动滑动返回,除非您明确移除手势识别器。 developer.apple.com/documentation/uikit/uinavigationcontroller/… -
@Samah,问题与返回无关。我的视图控制器以模态方式显示,因此无法通过滑动返回(即使它在导航控制器中)
-
我不明白你的用例。您希望用户向哪个方向滑动以关闭对话框?
-
@Samah,我的视图控制器以模态方式出现,因此它从屏幕底部出现。我通过从上到下平移来消除它。问题是,我的滚动视图也可以垂直滚动,所以两个平移手势之间存在冲突,我需要解决它
-
你有没有考虑过只对两个动作都使用滚动视图的识别器?
标签: ios swift uiscrollview uipangesturerecognizer