多个 CGAffineTranform 语句不能给出平滑的结果

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

我正在 UIView 上应用旋转和缩放。 当我应用这些变换之一时,它工作得很好但是当我尝试应用这两种变换时,结果有点不太顺利。它会在重置并开始应用时出现。这是我的代码

var location:CGPoint = CGPoint.zero
var rotatingLoaction:CGPoint = CGPoint.zero
var deltaAngle: CGFloat!
func handleRotateAndResizeWithPanGestureRecognizer(_ recognizer: UIPanGestureRecognizer) -> Void
{
    location = recognizer.location(in: self.superview)

    let sizeCenter = CGPoint(x: (self.frame.origin.x + self.frame.size.width) / 2.0, y: (self.frame.origin.y + self.frame.size.height) / 2.0)
    
    if recognizer.state == .began {
        initialDistance = sizeCenter.getDistance(point: location)
        deltaAngle = atan2(location.y - sizeCenter.y, location.x - sizeCenter.x) - self.transform.getAngle()
    }
    else if recognizer.state == .changed
    {
        let ang = atan2(location.y - sizeCenter.y,
                          location.x - sizeCenter.x);
        let angleDiff = deltaAngle - ang;
        
        self.setNeedsDisplay()
        var t = CGAffineTransform.identity
        let distance = CGFloat(sizeCenter.getDistance(point: location))
        let scale =  distance / initialDistance
        t = t.rotated(by: -angleDiff)
        t = t.scaledBy(x:  CGFloat(scale), y: CGFloat(scale))
       
        self.transform  =  t
        
        self.setNeedsDisplay()
         print("\(center )    \(scale)")
    }
   
}

更新这是我的 getDistance 方法,它是用 CGPoint 的扩展编写的

func getDistance(point: CGPoint) -> CGFloat {
        let fx = (point.x - self.x);
        let fy = (point.y - self.y);
        
        return sqrt((fx*fx + fy*fy))
    }
ios iphone swift cgaffinetransform cgaffinetransformscale
1个回答
1
投票

看起来角度按预期工作,但缩放比例不正常。 我可以看到,每次开始拖动时,您都会考虑当前的视图角度,但不会考虑当前的缩放比例。因此,答案在于每次开始拖动时相对于其先前状态缩放视图。

如果没有运行示例,我无法对此进行测试,但我认为如果您进行这个小更改,您可能会得到所需的结果:

if recognizer.state == .began {
    initialDistance = sizeCenter.getDistance(point: location) / sqrt(transform.a * transform.a + transform.c * transform.c)
© www.soinside.com 2019 - 2024. All rights reserved.