【发布时间】:2019-02-28 22:46:52
【问题描述】:
问题摘要
无法在已翻译的UIView 上正确执行移动和缩放动画。
当视图没有事先移动时,为了达到预期的效果,我先应用缩放,然后应用平移。我使用UIViewPropertyAnimator 为生成的转换设置动画:视图在相应移动的同时放大或缩小。
但是,如果在应用此动画转换之前视图已从其原始位置移动(翻译),我未能实现在将视图从其新位置移动时放大或缩小的结果.
¡虽然转换问题有据可查 - 而且我在提交问题之前已经尽职尽责 - 到目前为止我还没有找到成功的解决方案! p>
变形动画代码
为了便于理解和解决问题,对代码进行了简化。
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)
}
}
此代码不会产生预期的效果:视图跳转到新位置,正确缩放并“随机”移动。
我肯定遗漏了一些东西——我可能瞄准了错误的最终结果矩阵——但总而言之,我目前陷入困境。
如果有人知道如何执行从已翻译的 UIView 缩放和移动 UIView 这样简单的任务,我将非常感谢他们的意见!
最好的,
编辑
一张图片可以抵 1000 个字,所以当我尝试实施迄今为止所提出的各种建议时会发生什么(特别是 .scaledBy(:) 方法):
你可以注意到最终的转换是正确的,但动画不是。
【问题讨论】:
标签: ios swift animation transform cgaffinetransform