CGAffineTransform缩放和翻译 - 在动画之前跳转

mat*_*eok 22 xcode transformation scale cgaffinetransform ios

我正在努力解决有关CGAffineTransform缩放和平移的问题,当我在已经有变换的视图上的动画块中设置变换时,视图会在动画之前跳过一点.

例:

// somewhere in view did load or during initialization
var view = UIView()
view.frame = CGRectMake(0,0,100,100)
var scale = CGAffineTransformMakeScale(0.8,0.8)
var translation = CGAffineTransformMakeTranslation(100,100)
var concat = CGAffineTransformConcat(translation, scale)
view.transform = transform

// called sometime later
func buttonPressed() {
    var secondScale = CGAffineTransformMakeScale(0.6,0.6)
    var secondTranslation = CGAffineTransformMakeTranslation(150,300)
    var secondConcat = CGAffineTransformConcat(secondTranslation, secondScale)
    UIView.animateWithDuration(0.5, animations: { () -> Void in 
         view.transform = secondConcat
    })

}
Run Code Online (Sandbox Code Playgroud)

现在,当调用buttonPressed()时,视图会在开始设置动画之前跳转到左上角大约10个像素.我只用一个concat变换来见证这个问题,只使用一个转换变换就可以了.

编辑:由于我已就此事做了大量研究,我想我应该提一下,无论是否打开了自动布局,都会出现此问题

The*_*heo 45

我遇到了同样的问题,但找不到问题的确切来源.跳转似乎只出现在非常特定的条件下:如果视图从变换动画变换t1为变换,t2并且两个变换都是缩放和平移的组合(这正是您的情况).鉴于以下对我没有意义的解决方法,我认为它是Core Animation中的一个错误.

首先,我尝试使用CATransform3D而不是CGAffineTransform.

旧代码:

var transform = CGAffineTransformIdentity
transform = CGAffineTransformScale(transform, 1.1, 1.1)
transform = CGAffineTransformTranslate(transform, 10, 10)
view.layer.setAffineTransform(transform)
Run Code Online (Sandbox Code Playgroud)

新代码:

var transform = CATransform3DIdentity
transform = CATransform3DScale(transform, 1.1, 1.1, 1.0)
transform = CATransform3DTranslate(transform, 10, 10, 0)
view.layer.transform = transform
Run Code Online (Sandbox Code Playgroud)

新代码应该等同于旧代码(第四个参数设置为1.0或者方向上0没有缩放/转换z),实际上它显示相同的跳转.然而,这里出现了黑魔法:在比例转换中,将z参数更改为不同的参数1.0,如下所示:

transform = CATransform3DScale(transform, 1.1, 1.1, 1.01)
Run Code Online (Sandbox Code Playgroud)

此参数应该没有效果,但现在跳转消失了.

  • 我认为这个答案没有得到足够的学分......我已经编写好几天了,无法解决这个问题. (4认同)
  • ☝️Ditto.我通过简单的缩放和翻译遇到了同样的问题.在动画制作之前,该层将向左移动一点点.将"1.01"标度应用于"z"轴可以解决问题. (2认同)