我如何使用 CGAffineTransform 进行正确的拖放

Posted

技术标签:

【中文标题】我如何使用 CGAffineTransform 进行正确的拖放【英文标题】:How i can use CGAffineTransform for correct drag and drop 【发布时间】:2019-02-07 22:27:44 【问题描述】:

我想通过 UIPanGestureRecognizer 对 UITextView 进行拖放,并在屏幕中心自动对齐。第一次拖动效果很好,但如果我再次尝试拖动,我的拖动从 UITextView 的初始点开始。我不知道如何解决它。

第一次拖动

第二次拖动

@objc func handlePan(gesture: UIPanGestureRecognizer) 
    let translation = gesture.translation(in: nil)

    switch gesture.state 
    case .changed:
        dragingText.transform = CGAffineTransform(translationX: translation.x, y: translation.y)

    case .ended:

        UIView.animate(withDuration: 1, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: 

            self.dragingText.transform = CGAffineTransform(translationX: 0, y: translation.y)

        , completion: nil)
    default:
        ()
    

【问题讨论】:

【参考方案1】:

您的任务不需要 CGAffine 变换。试试:

案例.更改: textview.center = CGPoint(x: textview.x + translation.x, y: textview.y + translation.y)

【讨论】:

有了这条线,稍微拖拽一下textView离开屏幕 尝试去掉 case .ended 语句? 我不能这样做,因为当用户停止拖动时,我会启动动画以使 textView 在屏幕上按当前 Y 位置居中。【参考方案2】:

解决了一个问题

 @objc func handlePan(gesture: UIPanGestureRecognizer) 
    let translation = gesture.translation(in: nil)

    switch gesture.state 
    case .changed:

        dragingText.center = CGPoint(x: dragingText.center.x + translation.x, y: dragingText.center.y + translation.y )
        gesture.setTranslation(CGPoint.zero, in: nil)

    case .ended:

        let isInside = isInsideDragableAres()

        if isInside.0 
            UIView.animate(withDuration: 0.7, delay: 0, usingSpringWithDamping: 0.4, initialSpringVelocity: 0.7, options: .curveEaseOut, animations: 
                self.dragingText.center = CGPoint(x: self.view.center.x, y: self.dragingText.center.y + translation.y )
            , completion: nil)
        
        else
            UIView.animate(withDuration: 0.7, delay: 0, usingSpringWithDamping: 0.4, initialSpringVelocity: 0.7, options: .curveEaseOut, animations: 
                self.dragingText.center = CGPoint(x: self.view.center.x, y: isInside.1! )
            , completion: nil)
        

    default:
        ()
    

【讨论】:

以上是关于我如何使用 CGAffineTransform 进行正确的拖放的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CGAffineTransform Scale 从右到左添加动画和放大动画

如何让 CGAffineTransform Scale 围绕其中心缩小视图?

CGAffineTransform 在其他视图上

定义 SnapKit 值时,CGAffineTransform 旋转会导致宽度和高度之间的切换

使用 CGAffineTransform 的 UIView 旋转

使用 CGAffineTransform 使用 UIViewContentModeTop 缩放 UIImageView