如何正确获取presentationLayer的当前变换?

Tha*_*nks 2 iphone core-animation

我试过这个:

CATransform3D rotationTransform = [[self.layer presentationLayer] transform];
Run Code Online (Sandbox Code Playgroud)

这将不起作用,因为编译器将抛出警告和错误:

警告:找到多个方法"-transform".错误:初始化程序无效.

那么我试过这个:

CATransform3D rotationTransform = [[self.layer presentationLayer] valueForKey:@"transform"];
Run Code Online (Sandbox Code Playgroud)

错误:初始化程序无效.

这有什么问题?

Rob*_*ier 6

-presentationLayer返回一个id.您需要将其强制转换为CALayer:

CATransform3D rotationTransform = [(CALayer*)[self.layer presentationLayer] transform];
Run Code Online (Sandbox Code Playgroud)

为了非常安全,你先检查一下:

CATransform3D rotationTransform = {0};
CALayer* presentationLayer = (CALayer*)[self.layer presentationLayer];
if( [presentationLayer respondsToSelector:@selector(transform)]) {
    rotationTransform = presentationLayer.transform;
}
Run Code Online (Sandbox Code Playgroud)

但在实践中,没有这个检查就可以了.

在第二种情况下,-valueForKey:还返回一个id,您尝试分配给struct,这是不可能隐式执行的.您不能只将对象指针强制转换为结构.