使用此代码:
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。
答案 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转换而丢失的弧度精度。