如何在拖动UIView时实现平滑动画

问题描述 投票:1回答:2

这是我到目前为止编写的代码,用于在拖动时更改视图的位置。

UIPanGestureRecognizer被改变或开始时,视图改变其中心点,当我放开手势时发生这种情况。我不要那个。我希望它像Notification Center and Control Center does一样伴随着我的拖累。

在此先感谢您的帮助。

class ViewController: UIViewController {

let maxY = UIScreen.main.bounds.height
lazy var slideUpView: UIView = {
    let view = UIView(frame: CGRect(x: 0, y: maxY - 295, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height / 3 ))
    view.backgroundColor = .green
    return view
}()


lazy var redImageView: UIView = {
    let view = UIView(frame: CGRect(x: 0, y: maxY - 295, width: UIScreen.main.bounds.width, height: slideUpView.frame.height / 2 ))
    view.backgroundColor = .red
    return view
}()

override func viewDidLoad() {
    super.viewDidLoad()

    print("MaxX: \(UIScreen.main.bounds.maxX)")
    print("Max Hight: \(UIScreen.main.bounds.height)")
    print("MaxY: \(UIScreen.main.bounds.maxY)")
    print("Max width: \(UIScreen.main.bounds.width)")
    // MARK: add the views as subview
    let viewsArray = [slideUpView, redImageView]
    viewsArray.forEach{view.addSubview($0)}
    // Add a UIPanGestureRecognizer to it
    viewsArray.forEach {createPanGestureRecognizer(targetView: $0)}
}

// The Pan Gesture
func createPanGestureRecognizer(targetView: UIView) {
    let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(recognizer:)))
    panGesture.maximumNumberOfTouches = 1
    targetView.addGestureRecognizer(panGesture)
}

@objc func handlePanGesture(recognizer: UIPanGestureRecognizer) {
    if recognizer.state == UIGestureRecognizerState.began || recognizer.state == UIGestureRecognizerState.changed {
        let translation = recognizer.translation(in: self.view)
        print(recognizer.view!.center.y)
        let newPos = CGPoint(x:recognizer.view!.center.x + translation.x, y: recognizer.view!.center.y + translation.y)
        if insideDraggableArea(newPos) {
            guard let targetedView = recognizer.view else {
                print("Error: No View to handle")
                return
            }
            targetedView.center.y = newPos.y
            recognizer.setTranslation(.zero, in: targetedView)
        }
    }
}

private func insideDraggableArea(_ point : CGPoint) -> Bool {
    return  // point.x > 50 && point.x < 200 &&
        point.y > (maxY * 0.27) && point.y <= maxY
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let position = touch.location(in: view)
        print(position)
    }
  }
 }
ios swift animation uipangesturerecognizer
2个回答
1
投票

这段代码工作正常。问题发生在我昨天使用的模拟器中。一切都按照我想要的方式在iPhone上进行测试。


0
投票

我也有这个问题,至少在游乐场原型中...

我将所有翻译(你已经处于更改状态)放在我在handlePanGesture函数中定义的UIViewProperty动画中,然后在开始/更改状态下调用.startAnimation()。

它需要对动画进行一些调整,但对我来说它更顺畅..

© www.soinside.com 2019 - 2024. All rights reserved.