【问题标题】:Clockwise image rotation animation顺时针图像旋转动画
【发布时间】:2018-02-28 11:53:27
【问题描述】:

我有一个动画,它应该不断旋转图像。但它有几个问题。速度很奇怪,尽管我将它设置为不断重复,但你可以看到它是如何开始、停止然后重复的。这不应该发生。它应该是不间断的旋转。 此外,另一个问题是当动画停止时,图像由于某种原因向左移动。

这是我的代码:

func animateLogo()
{
    UIView.animate(withDuration: 6.0, delay: 0.0, options: .repeat, animations: {
        self.logo.transform = CGAffineTransform(rotationAngle: ((180.0 * CGFloat(Double.pi)) / 180.0))
    }, completion: nil)
}

【问题讨论】:

  • 尝试将锚点设置为0.5
  • 并使用来自stackoverflow.com/questions/9844925/…self.logo.transform = CGAffineTransform(rotationAngle: (CGFloat(Double.pi))之类的动画
  • 我认为您原始代码的唯一问题是旋转角度应该以弧度为单位:Double.pi*2

标签: ios swift uiviewanimation cgaffinetransform


【解决方案1】:

试试这个

func rotateView(targetView: UIView, duration: Double = 1.0) {
    UIView.animate(withDuration: duration, delay: 0.0, options: .curveLinear, animations: {
        targetView.transform = targetView.transform.rotated(by: CGFloat(M_PI))
    }) { finished in
        self.rotateView(targetView: YOUR_LOGO, duration: duration)
    }
}

如何使用

self.rotateView(targetView: YOUR_LOGO, duration: duration)

【讨论】:

  • 完美!这就是我想要的!
  • 我必须再等 1 分钟,你知道的规则 :) 但我会的。感谢您的帮助!
【解决方案2】:

在 iOS 中,坐标系是翻转的。因此,随着学位的增加,您顺时针方向前进。这意味着通过 270° 会给你一个角度,相当于标准坐标系中的 90°。请记住这一点并相应地提供所需的角度。

考虑以下方法。

1) 方便的角度扩展

postfix operator °

protocol IntegerInitializable: ExpressibleByIntegerLiteral {
    init (_: Int)
}

extension Int: IntegerInitializable {
    postfix public static func °(lhs: Int) -> CGFloat {
        return CGFloat(lhs) * .pi / 180
    }
}

extension CGFloat: IntegerInitializable {
    postfix public static func °(lhs: CGFloat) -> CGFloat {
        return lhs * .pi / 180
    }
}

2) 使用 CABasicAnimation 旋转到任意角度:

extension UIView {
    func rotateWithAnimation(angle: CGFloat, duration: CGFloat? = nil) {
        let pathAnimation = CABasicAnimation(keyPath: "transform.rotation")
        pathAnimation.duration = CFTimeInterval(duration ?? 2.0)
        pathAnimation.fromValue = 0
        pathAnimation.toValue = angle
        pathAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
        self.transform = transform.rotated(by: angle)
        self.layer.add(pathAnimation, forKey: "transform.rotation")
    }
}

用法:

override func viewDidAppear(_ animated: Bool) {
    // clockwise
    myView.rotateWithAnimation(angle: 90°)

    // counter-clockwise
    myView.rotateWithAnimation(angle: -270°) 

}

传递负值会逆时针旋转。

【讨论】:

    【解决方案3】:

    角度应该是弧度而不是度数。以弧度表示的角度 = 度 * pi / 180。因此,如果要旋转 360 度,则应输入弧度 = 360 * pi / 180 = 2 * pi = 2 * 3.1415 = 6.283。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多