Swift中使用CATransform3D.m34设置透视后叠加变换失效求助
解决Swift中CATransform3D透视叠加变换失效的问题
嘿,我懂你把《iOS Core Animation: Advanced Techniques》里的Objective-C代码转成Swift时遇到的困扰——明明理解m34的透视作用,但转完代码后效果就是不对。核心问题其实是你搞混了Swift里两个变换API的区别:你用了创建新变换的方法,而不是在已有透视变换基础上叠加旋转的方法。
问题出在哪?
你写的CATransform3DMakerotation(注意这里还有个拼写错误,正确是CATransform3DMakeRotation)是直接生成一个全新的旋转变换,会完全覆盖你之前设置好m34参数的透视变换。而Objective-C里的CATransform3DRotate是接收一个已有变换,返回叠加了旋转效果的新变换,这才是你需要的叠加逻辑!
修正后的Swift代码
把创建新旋转的方法换成叠加旋转的CATransform3DRotate,就能保留透视效果了:
var transform = CATransform3DIdentity transform.m34 = -1 / 500.0 // 用CATransform3DRotate在已有透视变换上叠加Y轴旋转 transform = CATransform3DRotate(transform, CGFloat(Double.pi/4), 0, 1, 0) viewIwantTransformed.layer.transform = transform
和Objective-C代码的逻辑对齐
Objective-C里的这段代码:
transform = CATransform3DRotate( transform, M_PI_4, 0, 1, 0);
本质是把带透视的transform传入,返回叠加旋转后的新变换;而你之前用的CATransform3DMakeRotation是从零开始生成旋转变换,自然就丢了之前设置的透视参数,导致效果失效。
预期效果

内容的提问来源于stack exchange,提问作者Lance Samaria
相关产品推荐
相关产品推荐

