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)
此参数应该没有效果,但现在跳转消失了.
✨
| 归档时间: |
|
| 查看次数: |
13061 次 |
| 最近记录: |