UIView панорамирование жестом по оси Y - PullRequest
0 голосов
/ 22 мая 2018

У меня есть UIView, который я могу перетаскивать по оси Y, который фиксируется в 1 из 2 позиций.Проблема в том, что мне нужно перетащить его через определенную точку на оси Y, чтобы он встал на место.Это кажется неуклюжим, когда вы пытаетесь быстро провести пальцем, но не проходите мимо этой конкретной оси Y, и он возвращается в исходное положение.

Моя желаемая цель - сделать так, чтобы он защелкнулся на 1 из 2 позиций в зависимости отнаправление, по которому пользователь проводил, когда он выпустил UIView.

@objc func panGesture(recognizer: UIPanGestureRecognizer) {
    let window = UIApplication.shared.keyWindow
    let translation = recognizer.translation(in: self)
    let currentY = self.frame.minY
    let partialY = (window?.frame.height)!-194
    let halfWayPoint = ((window?.frame.height)!/2)-40

    self.frame = CGRect(x: 0, y: currentY + translation.y, width: self.frame.width, height: self.frame.height)
    recognizer.setTranslation(CGPoint.zero, in: self)

    switch recognizer.state {

    case .changed:

        // Prevent scrolling up past y:0
        if currentY <= 0
        {
            self.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height)
        }

    case .ended:

        // Snap to 80 (y) (expanded)
        if currentY < 80 || currentY > 80 && currentY < halfWayPoint
        {
            UIView.animate(withDuration:0.62, delay: 0.0, usingSpringWithDamping: 0.62, initialSpringVelocity: 0.5, options: .curveEaseInOut, animations:
                {
                    recognizer.view!.frame = CGRect(x: 0, y: 80, width: self.frame.width, height: self.frame.height)
            }, completion: { (true) in
                self.isExpanded = true
            })
        }

        // Snap back to partial (y) (original position)
        if currentY > partialY || currentY < partialY && currentY > halfWayPoint
        {
            UIView.animate(withDuration:0.62, delay: 0.0, usingSpringWithDamping: 0.62, initialSpringVelocity: 0.5, options: .curveEaseInOut, animations:
                {
                    recognizer.view!.frame = CGRect(x: 0, y: partialY, width: self.frame.width, height: self.frame.height)
            }, completion: {(true) in
                self.isExpanded = false
            })
        }

    default:
        print("Default")
    }

Как вы можете видеть, halfWayPoint - это точка, в которой представление должно быть над или под ним, чтобы определить положение, в которое оно привязывается.Это неэффективно, и я хотел бы сделать это в зависимости от направления (вверх или вниз), когда пользователь перетаскивает вид.

1 Ответ

0 голосов
/ 22 мая 2018

Я предлагаю вам использовать метод UIPanGestureRecognizers. velicoty (in:) .Он дает вам скорость пролистывания (в пунктах в секунду).

Если вы просто добавите его к currentY (желательно с некоторой константой), вы получите это легкое ощущение, и жест будет чувствоватьболее естественным.

Просто замените let currentY = self.frame.minY на let currentY = self.frame.minY + recognizer.velocity(in: nil).y * someConstant и играйте с someConstant, пока не получите желаемое чувство.

...