iphone - 嵌套 CALayers 不接受透视变换

标签 iphone cocoa core-animation quartz-graphics calayer

我正在尝试利用 CALayers 在我的一个应用程序中创建 3D 风格效果。然而,嵌套的 CALayers 似乎没有应用透视。

为了用伪代码进行说明,如果我有一个像这样应用透视的图层:

CATransform3D subLayerTransform = CATransform3DIdentity;

/* set perspective */
subLayerTransform.m34 = -0.002;
superLayer.sublayerTransform = subLayerTransform;

添加然后向其添加一个图层,如下所示:

CALayer *sublayer = [CALayer layer];
sublayer.frame = layerFrame;
sublayer.contents = (id)[image CGImage];
[superLayer addSublayer: sublayer];

透视图按预期应用。但是,如果我尝试进一步嵌套层

CALayer *sublayer = [CALayer layer];
[superLayer addSublayer: sublayer];

CALayer *nestedlayer = [CALayer layer];
nestedlayer.frame = layerFrame;
nestedlayer.contents = (id)[image CGImage];
[sublayer addSublayer: nestedlayer];

旋转时嵌套层是平坦的。

就好像 superLayer 仅将变换应用于图层层次结构中直接位于其下方的图层。是这样吗?还是我做错了什么?

最佳答案

技巧是使用 CATransformLayer 作为子层。

由于该层实际上并不“显示”任何内容,因此您需要添加传统的 CALayers 作为 CATransformLayer 的子级来完成显示内容的工作。但它所做的是出色地维护对象坐标空间,然后将适当的变换应用于其子层。

关于iphone - 嵌套 CALayers 不接受透视变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2412550/

相关文章:

iphone - 关闭模态视图 Controller 并将数据传回

ios - Sirikit 自定义意图和 iOS 13.4.1 的国际化问题

macos - 我如何在 OSX 上制作这个 iOS 动画?

iphone - cocoa 的选择性采伐

jquery - iPhone 喜欢在 web 上打开的文件夹设计

objective-c - 对实现比较的对象的 NSFetchRequest 结果进行排序 :

sqlite - 在字符串中的任意位置使用 LIKE 进行搜索

ios - 完美的 Swift3 Boing

ios - getControlPointAtIndex 参数类型

swift - 停止旧动画并开始新动画,一旦我改变片段, swift