小编典典

如何实现导航堆栈中的View Controller的“拖动权以关闭”?

swift

默认情况下,如果从屏幕的左边缘向右拖动,它将拖动ViewController并将其移出堆栈。

我想将此功能扩展到整个屏幕。当用户向右拖动时,我希望发生同样的事情。

我知道我可以执行向右滑动手势,只需调用
self.navigationController?.popViewControllerAnimated(true)

但是,没有“拖动”动作。我希望用户能够像拖动鼠标一样右键拖动视图控制器,以显示其下方。并且,如果将其拖到50%以上,请将其关闭。(查看instagram了解我的意思。)


阅读 241

收藏
2020-07-07

共1个答案

小编典典

在此处输入图片说明

在Github中制作了一个演示项目
https://github.com/rishi420/SwipeRightToPopController

我用过UIViewControllerAnimatedTransitioning协议

从文档中:

//这用于百分比驱动的交互式过渡以及容器控制器…

UIPanGestureRecognizer在控制器的视图中添加了一个。这是手势的动作:

func handlePanGesture(panGesture: UIPanGestureRecognizer) {

    let percent = max(panGesture.translationInView(view).x, 0) / view.frame.width

    switch panGesture.state {

    case .Began:
        navigationController?.delegate = self
        navigationController?.popViewControllerAnimated(true)

    case .Changed:
        percentDrivenInteractiveTransition.updateInteractiveTransition(percent)

    case .Ended:
        let velocity = panGesture.velocityInView(view).x

        // Continue if drag more than 50% of screen width or velocity is higher than 1000
        if percent > 0.5 || velocity > 1000 {
            percentDrivenInteractiveTransition.finishInteractiveTransition()
        } else {
            percentDrivenInteractiveTransition.cancelInteractiveTransition()
        }

    case .Cancelled, .Failed:
        percentDrivenInteractiveTransition.cancelInteractiveTransition()

    default:
        break
    }
}

脚步:

  1. 计算视图上的拖动百分比
  2. .Begin:指定要执行的序列并分配UINavigationController委托。需要代表InteractiveTransitioning
  3. .Changed: 带百分比的UpdateInteractiveTransition
  4. .Ended: 如果拖动50%或更高或更高的速度,则继续保持过渡状态,否则取消
  5. .Cancelled, .Failed: 取消过渡

参考文献:

  1. UIPercentDrivenInteractiveTransition
  2. https://github.com/visnup/swipe-left
  3. https://github.com/robertmryan/ScreenEdgeGestureNavigationController
  4. https://github.com/groomsy/custom-navigation-animation-transition-demo
2020-07-07