【问题标题】:Multiple CGAffineTranform statements dont give smooth results多个 CGAffineTransform 语句不会给出平滑的结果
【发布时间】:2018-01-18 22:42:55
【问题描述】:

我正在对我的 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)")
    }

}

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

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】:

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

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

    if recognizer.state == .began {
        initialDistance = sizeCenter.getDistance(point: location) / sqrt(transform.a * transform.a + transform.c * transform.c)
    

    【讨论】:

    • 我应用了您的代码它仅在视图平行于 X 轴时才有效,因为当我将视图旋转到平行于 y 时,它会抖动得更多并且尺寸也会减小。
    • 当视图倒置并尝试缩放时,它会快速旋转回来
    • 我也在我的问题中添加了 getDistance 方法。当我顺时针旋转穿过 y 轴时,a 的值变为负数。所以这也需要考虑
    • 我的错,计算比例因子有点复杂。我编辑了我的答案。见hackingwithswift.com/example-code/core-graphics/…
    猜你喜欢
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多