gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:59:38 25 4
gpt4 key购买 nike

问题总结

无法在已翻译的 UIView 上正确执行移动和缩放动画。

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

但是,如果在应用此动画转换之前 View 已从其原始位置移动(平移),我无法实现包含在将 View 从其新位置移动时向上或向下缩放的结果

¡尽管转换问题已得到充分记录 - 并且我在提交问题之前进行了尽职调查 - 到目前为止我未能找到成功的解决方案!

变换动画代码

为了便于理解和解决问题,对代码进行了简化。

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) -> 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
}
}

到目前为止的尝试

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

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)
}
}

这段代码没有产生预期的效果: View 到一个新位置,正确缩放并“随机”移动。

我肯定遗漏了一些东西——我可能瞄准了错误的最终结果矩阵——但总的来说,我目前被困住了。

如果有人知道如何执行这样一个简单的任务,例如从已翻译的 UIView 缩放和移动 UIView,我将非常感谢他们的意见!

最好的,


编辑

一张图片可以抵得上 1,000 个单词,所以这是当我尝试实现迄今为止所提出的各种建议(特别是 .scaledBy(:) 方法)时发生的情况:

enter image description here

您会注意到最终的转换是正确的,但动画不是。

最佳答案

您是否尝试过将当前变换分配给一个属性,然后修改这个复制的属性,然后重新分配给 View ?像这样的东西:

let originalTransform = view.transform
let scaledTransform = originalTransform.scaledBy(x: 0.2, y: 0.2)
view.transform = scaledTransform

我已经使用这种方法创建了一个按钮的动画并且效果很好,但我不确定这是否是您正在寻找的。

关于ios - 如何在先前转换的 UIView 上正确地动画转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54935477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com