ios - CABasicAnimation - 在暂停期间更改动画开始值
<p><p>为了360度旋转我使用CABasicAnimation,这样:</p>
<pre><code>func startRotate(from : Double) {
let rotation : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
rotation.fromValue = from
rotation.toValue = NSNumber(value: M_PI * 2 - from)
rotation.duration = 10
rotation.isCumulative = true
rotation.repeatCount = 1
self.cdImage.layer.add(rotation, forKey: "rotationAnimation")
}
</code></pre>
<p>第一次 cdImage( View )从值 0 开始。</p>
<p>当动画到达中间时(5 秒后),我想停止动画并为 cdImageView 设置一个变换,例如将 View 返回 20 度并从新位置恢复。</p>
<p>通过这种方式:
1.我调用stopRotate函数</p>
<pre><code>func stopRotate(from : Double) {
self.cdImage.layer.removeAnimation(forKey: "rotationAnimation")
}
</code></pre>
<ol 开始=“2”>
<li><p>我设置了一个新的变换</p>
<pre><code>self.cdImage.transform = CGAffineTransform(rotationAngle: imageAngle *CGFloat(M_PI) / 180);
</code></pre> </li>
<li><p>使用新值调用 startRotate </p>
<p>startRotate(imageAngle * CGFloat(M_PI)/180)</p></li>
</ol>
<p>我假设动画将从新位置开始并再次旋转 360 度 View ,但实际上动画从 0 度开始循环,我如何才能从新位置恢复新动画?</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>如果你想从中断的地方继续,当你停止动画时,你想:</p>
<ul>
<li>捕捉它旋转了多少(见 <a href="https://stackoverflow.com/a/9712319/1271826" rel="noreferrer noopener nofollow">https://stackoverflow.com/a/9712319/1271826</a>);</li>
<li>通过检查表示层确定飞行中的值;</li>
<li>相应地设置图层的<code>transform</code>(以便在您移除动画时它会保留在那里);和</li>
<li>移除动画</li>
</ul>
<p>因此:</p>
<pre><code>var angle: CGFloat?
func stopRotate() {
let transform = cdImage.layer.presentation()!.transform
angle = atan2(transform.m12, transform.m11);
cdImage.layer.transform = transform
cdImage.layer.removeAnimation(forKey: "rotationAnimation")
}
</code></pre>
<p>然后,您可以在重新启动时从该 <code>角度</code> 开始动画。</p></p>
<p style="font-size: 20px;">关于ios - CABasicAnimation - 在暂停期间更改动画开始值,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/41520065/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/41520065/
</a>
</p>
页:
[1]