iOS BottomSheetView的拖动消失效果

495 阅读1分钟

最近写了一个底部弹出的类似抖音评论页的需求,产品要加个下拉拖动消失的效果,自己手写了一个。

直接上代码吧

private func handlePanGesture(pan: UIPanGestureRecognizer) {
        let point = pan.translation(in: mainView)
        //每次移动记录偏移百分比
        currentPercent = min(max(point.y/mainView.frame.size.height, 0), 1)
        switch pan.state {
        case .began:
            //记录起始y值
            beginY = pan.view?.mj_y
        case .changed:
            //根据起始y值和偏移y,改变目标view的y值
            pan.view?.mj_y = (beginY ?? screenHeight - mainViewSize.mainHeight) + point.y
            //设置上边界
            pan.view?.mj_y = max(pan.view?.mj_y ?? screenHeight - mainViewSize.mainHeight, screenHeight - mainViewSize.mainHeight)
        case .ended:
            // 偏移超过设定值,消失;否则复位
            if currentPercent > 1/3 {
                UIView.animate(withDuration: 0.25, animations: {
                    pan.view?.mj_y = screenHeight
                }, completion: {_ in
                    self.onClose()
                })
            } else {
                UIView.animate(withDuration: 0.25, animations: {
                    pan.view?.mj_y = screenHeight - self.mainViewSize.mainHeight
                }, completion: nil)
            }
        default:
            break
        }
    }