iOS8中CGAffineTransform的动画与iOS7中的动画不同

man*_*cus 20 animation objective-c cgaffinetransform ios ios8

我试图找到一个原因,为什么UIView转换属性的动画在iOS 8中看起来与iOS 6/7不同.

举一个简单的例子,在iOS 8之前:

myView.transform = CGAffineTransformRotate(CGAffineTransformIdentity, 1.57);
[UIView animateWithDuration:5 animations:^{
    myView.transform = CGAffineTransformTranslate(plane.transform, 100, 0);
}];
Run Code Online (Sandbox Code Playgroud)

给出预期的结果,"myView"旋转90度并向下移动,但在iOS8中,当翻译动画时,它开始于我无法找到解释的点(打破动画).

有谁知道它的解释?提前致谢!

Pbk*_*Pbk 5

CGAffineTransformIdentity在ios​​7和ios8上的行为有所不同.这与自动布局和大小类有关.解决方案是删除与ios7上的动画冲突的约束.

// solve the constraint-animation problem
if(NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1) {
    // iOS7 remove constraints that conflict with animation
    if (self.centerYAlignment != nil) {
        self.view.removeConstraint(self.centerYAlignment) //is an IBOutlet 
    }
} else {
    // iOS8 constraint animations are fine
}
Run Code Online (Sandbox Code Playgroud)


tob*_*ann 1

我在缩放方面也遇到了同样的问题。我想旋转也可能是一样的。你能试试这个吗?

myView.transform = CGAffineTransformConcat(myView.transform , CGAffineTransformMakeRotate(1.57));
[UIView animateWithDuration:5 animations:^{
    myView.transform = CGAffineTransformTranslate(plane.transform, 100, 0);
}];
Run Code Online (Sandbox Code Playgroud)

也许还需要使用 CGAffineTransformMakeTranslate 和 CGAffineTransformConcat ,我不确定。

最糟糕的部分是:你必须在 iOS 版本上执行 if/else,因为这在 iOS 7 上看起来很奇怪。我希望 Apple 在 iOS 8 发布之前或发布时解决这个问题。