如何消除"跳跃"在我的CABasicAnimation中?

时间:2017-02-12 17:35:10

标签: ios swift uiview core-animation cabasicanimation

使用此代码:

func rotateTheView(_ aView: UIView, inClockwiseDirection isClockwise: Bool) {
    let multiplier = (isClockwise ? 1 : -1)
    let key = (isClockwise ? "Spin" : "Rotate")
    var rotation: CABasicAnimation?
    rotation = CABasicAnimation(keyPath: "transform.rotation")
    rotation!.fromValue = Int(0)
    let multiplicand = multiplier * 2
    rotation!.toValue = Int(Double(multiplicand) * .pi)
    rotation!.duration = 30 // Speed
    rotation!.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
    rotation!.repeatCount = HUGE  //HUGE_VALF Repeat forever.
    aView.layer.add(rotation!, forKey: key)
}

我得到了我想要的动画。 (轮子旋转,或者一个单元在相反方向上旋转得足够快,始终保持正好朝上)。

然而,当30秒(持续时间)结束时,当视图跳回到动画前的状态时,会出现闪烁。

我知道它应该以这种方式工作。

如何将旋转应用于"之前"图像,以便当持续时间到期时,我看不到任何细胞跳跃?

增加动画的持续时间会减慢滚轮的旋转速度,因此这不是一个合适的解决方案。

如果适用#22521690,我就不明白 - 我没有明确的CATransaction。

2 个答案:

答案 0 :(得分:2)

在将动画应用于图层后的下一行中,将要设置动画的属性设置为其结束值。

因为动画是“飞行中”,所以图层的正常显示覆盖了表示层,即特殊的动画层。

动画完成后,隐藏/删除表示层,并显示实际图层。如果它与动画结尾处的表示层处于相同状态,那么就没有跳跃。

该代码可能如下所示:

getKeyFromString(temp, key, strlen(temp))

答案 1 :(得分:2)

尝试

rotation!.toValue = Int(Double(multiplicand) * .pi)

而不是

public class SplashScreen extends Activity {

    protected Intent intent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.activity_splash_screen);

        intent = new Intent(getApplicationContext(), MainActivity.class);

        // MainActivity.class  contains WebView

        Thread myThread = new Thread() {
            @Override
            public void run() {

                try {
                    sleep(5000);
                    startActivity(intent);
                    finish();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        };

        myThread.start();
    }
}

问题在于因Int转换而丢失的弧度精度。