ios - CGAffineTransform缩放和平移-动画前跳转

标签 ios xcode scale transformation cgaffinetransform

我正在努力解决有关 CGAffineTransform 缩放和平移的问题,当我在一个已经具有变换的 View 的动画 block 中设置变换时, View 在设置动画之前会跳动一点。

例子:

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

}

现在,当调用 buttonPressed() 时, View 会在开始动画之前跳到左上角大约 10 像素处。我只在 concat 转换中发现了这个问题,仅使用转换转换就可以正常工作。

编辑:因为我对此事做了很多研究,所以我想我应该提一下,无论是否打开自动布局,都会出现此问题

最佳答案

我遇到了同样的问题,但找不到问题的确切根源。跳转似乎只出现在非常特定的条件下:如果 View 从变换 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)

新代码:

var transform = CATransform3DIdentity
transform = CATransform3DScale(transform, 1.1, 1.1, 1.0)
transform = CATransform3DTranslate(transform, 10, 10, 0)
view.layer.transform = transform

新代码应该等同于旧代码(第四个参数设置为1.00 以便在z 中没有缩放/平移 方向),实际上它显示了相同的跳跃。然而,黑魔法来了:在比例转换中,将 z 参数更改为不同于 1.0 的任何值,如下所示:

transform = CATransform3DScale(transform, 1.1, 1.1, 1.01)

这个参数应该没有作用,但是现在跳转没有了。

🎩✨

关于ios - CGAffineTransform缩放和平移-动画前跳转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27931421/

相关文章:

ios - iOS 中的工具提示通过 native UI 控件?

ios - Swift:通过 RESTful API 进行身份验证后更改 ViewController

ios - MKMapView 选择注解

ios - 如何获取用户的时区?

ios - 托管对象模型初始化

安卓,WebView.getWidth() == window.innerWidth

c# - MvxTabBarViewController 作为第一个 ViewController 没有出现

objective-c - 旋转和捏合(缩放)手势会扰乱父 UIView 及其 subview 框架

javascript - 数据库支持的工作队列

xcode - NSDocumentController 如何插入我的基于文档的应用程序?