菜鸟教程小白 发表于 2022-12-11 22:19:03

ios - 如何在先前转换的 UIView 上正确地为转换设置动画


                                            <p><h2><strong>问题摘要</strong></h2>

<p><strong>无法在已翻译的 <code>UIView</code> 上正确执行移动和缩放动画。</strong></p>

<p>当 View 事先没有被移动时,为了达到预期的效果,我先应用<strong>缩放,然后应用平移</strong>。我使用 <code>UIViewPropertyAnimator</code> 为生成的转换设置动画: View 在相应移动的同时放大或缩小。</p>

<p>但是,如果在应用此动画转换之前 View 已从其原始位置移动(翻译),<em>我未能实现在将 View 从其新位置移动时<strong>放大或缩小的结果</strong>.</em></p>

<p><em>¡<strong>虽然转换问题有据可查 - 并且我在提交问题之前已经尽职尽责 - 到目前为止我未能找到成功的解决方案</strong>!</em></em> p>

<h2>变形动画代码</h2>

<p><em>为了便于理解和解决问题,对代码进行了简化。</em></p>

<pre><code>extension UIView {

   func zoomAndMove(vector: CGPoint, scale: CGPoint){
      self.transform = self.transform.concatenating(CGAffineTransform(scaleX: scale.x, y: scale.y).concatenating(CGAffineTransform(translationX: vector.x, y: vector.y))
   }


   func animateZoomAndMove(from origin: CGPoint, for duration: TimeInterval, cameraZoom: CGPoint, timingFunction: UITimingCurveProvider, controlPoint2: CGPoint(x: 0.8, y: 0.7)) autoplay: Bool = false) -&gt; UIViewPropertyAnimator {
      let animator = UIViewPropertyAnimator(duration: duration, timingParameters: timingFunction)
      let vector = CGPoint(x: self.frame.midX - origin.x, y: self.frame.midY - origin.y)

      animator.addAnimations {
         self.zoomAndMove(vector: vector, scale: cameraZoom)
      }

      if autoplay { animator.startAnimation()}
      return animator
   }
}
</code></pre>

<h2>目前的尝试</h2>

<p>我试图修改我的代码以返回一个转换,该转换考虑了 <code>zoomAndMove</code> 发生之前的先前翻译:</p>

<pre><code>extension UIView {

   func zoomAndMove(vector: CGPoint, scale: CGPoint){

      if self.transform == CGAffineTransform.identity {
          self.transform = self.transform.concatenating(CGAffineTransform(scaleX: scale.x, y: scale.y).concatenating(CGAffineTransform(translationX: vector.x, y: vector.y))
      } else {
          let preTransform = self.transform
          self.transform = CGAffineTransform(a: scale.x, b: 0, c: 0, d: scale.y, tx: vector.x + preTransform.tx, ty: vector.y + preTransform.ty)
      }
   }
</code></pre>

<p>此代码<strong>不会产生预期的效果</strong>: View <strong>跳转</strong>到新位置,正确缩放并“随机”移动。</p>

<p>我肯定遗漏了一些东西——我可能瞄准了错误的最终结果矩阵——但总而言之,我目前陷入困境。 </p>

<p>如果有人知道如何执行诸如<strong><em>从已翻译的 UIView 缩放和移动 UIView</em></strong> 这样简单的任务,我将非常感谢他们的意见!</p>

<p>最好的,</p>

<hr/>

<h2>编辑</h2>

<p>一张图片可以抵 1,000 字,所以当我尝试实现迄今为止提出的各种建议时会发生什么(特别是 <code>.scaledBy(:)</code> 方法) :</p>

<p> <a href="/image/dKZq6.gif" rel="noreferrer noopener nofollow"><img src="/image/dKZq6.gif" alt="enter image description here"/></a> </p>

<p>你可以注意到最终的转换是正确的,但动画不是。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您是否尝试过将当前转换分配给一个属性,然后修改这个复制的属性,然后重新分配给 View ?
类似:</p>

<pre><code>let originalTransform = view.transform
let scaledTransform = originalTransform.scaledBy(x: 0.2, y: 0.2)
view.transform = scaledTransform
</code></pre>

<p>我使用这种方法创建了一个按钮动画,效果很好,但我不确定它是否是您要找的。</​​p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何在先前转换的 UIView 上正确地为转换设置动画,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/54935477/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/54935477/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何在先前转换的 UIView 上正确地为转换设置动画