【问题标题】:CGAffineTransformMakeRotation with negative M_PI负 M_PI 的 CGAffineTransformMakeRotation
【发布时间】:2015-06-23 15:37:02
【问题描述】:

我正在使用CGAffineTransformMakeRotation 在动画块内旋转UIView,我想逆时针旋转180º

但是当我放

myView.animateWithDuration(0.5)
myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI))

它仍然顺时针旋转。令我困惑的是,如果我“手动”编写M_PI 的值,它会按预期工作

 // this will rotate counterclockwise
 myView.transform = CGAffineTransformMakeRotation(CGFloat(-3.14159265358979))

为什么会有这种行为?

编辑:添加我正在使用动画块

【问题讨论】:

  • 我无法在 objective-c 或 swift 中重现您的问题,始终顺时针旋转 - 旋转 -3.141592 会产生所需的效果。

标签: ios swift uiview ios8 cgaffinetransform


【解决方案1】:

正如我在第一条评论中所说的那样,正如 Segii 已经写的那样:动画将在它现在的价值和它试图去的地方之间采取最短的距离。恕我直言,最好的解决方案是使用CABasicAnimation 强制逆时针旋转:

let anim = CABasicAnimation(keyPath: "transform.rotation")
anim.fromValue = M_PI
anim.toValue = 0
anim.additive = true
anim.duration = 2.0

myView.layer.addAnimation(anim, forKey: "rotate")
myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI))

这会将它一次逆时针旋转 180。

您在最后一行中指定的角度 + fromValue 是起始角度 -> 0。然后旋转距离 (toValue - fromValue) = 0 - M_PI = - M_PI -> 逆时针旋转 180 度。

【讨论】:

  • 由于某种原因这对我不起作用。我也使用 CGFloat.pi 作为 swift 3.0 的首选
  • M_PI 和 -M_PI 对我不起作用,但是从/向 CGAffineTransformMakeRotation 值减去/添加 0.01 可以为动画创建最短距离,但在视觉上你不会看到差异.
【解决方案2】:

据我了解,您正在尝试在动画块内旋转视图。 animateWithDuration 将始终以最短的方式执行动画。因此,M_PI 和 -M_PI 给出相同的目标位置。手动设置时获得预期动画方向的原因是您的手动值确实小于 M_PI,因此最短的旋转方式是逆时针旋转。

要获得预期的行为,您必须链接至少两个动画, 分割你的旋转角度。例如

//first animation block
myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI/2))CGAffineTransformMakeRotation;
//second animation block
myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI/2))CGAffineTransformMakeRotation;

Swift 3.0

myView.transform = CGAffineTransform(rotationAngle: CGFloat(-M_PI/2))

或者,更可靠的是,使用 CAKeyframeAnimation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多