作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在屏幕上有一个 2D View 网格(我称它们为图 block )。每个图 block 都有一个 subview ,我在动画 block 中围绕 Y 轴旋转。我已经在每个图 block 上正确设置了 sublayerTransform。我正在旋转的所有 subview 都展示了 3D 透视图。问题是每个消失点都是图 block 的中心而不是屏幕的中心,破坏了 3D 的幻觉。当我在所有图 block 的父级上设置 sublayerTransform 时,旋转 View 不会显示任何透视图。我相信这是因为 sublayerTransform 仅适用于层的子层而不适用于孙子层。如何使所有旋转 View 使用相同的消失点?我已经包含了一个绘制不佳的图像来帮助说明这一点。
最佳答案
解决方法是:你必须给superlayer添加translation transform,然后通过调整sublayer的位置来弥补。我成功地使用了以下一段代码,只需创建一个空的“单 View 应用程序”XCode 项目并在 iPad 模拟器上运行:
- (void)viewDidLoad
{
[super viewDidLoad];
for (int i = 0; i < 6; i++)
{
CALayer *parent = [CALayer layer];
parent.frame = CGRectMake(0, 0, 100, 100);
parent.position = CGPointMake(70 + 120*i, 70);
parent.backgroundColor = [[UIColor greenColor] CGColor];
[self.view.layer addSublayer:parent];
float width = self.view.frame.size.width/2.0;
float offset = (width - parent.position.x);
CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(0, 0, 40, 40);
layer.position = CGPointMake(-offset + 50, 60);
layer.backgroundColor = [[UIColor redColor] CGColor];
layer.transform = CATransform3DMakeRotation(M_PI_2, 0, 1, 0);
CATransform3D tr = CATransform3DMakeTranslation(offset, 0, 0);
CATransform3D t = CATransform3DIdentity ;
t.m34 = -4.0f/2000.0f ;
parent.sublayerTransform = CATransform3DConcat(t, tr);
[parent addSublayer:layer];
}
}
关于ios - 如何让 CALayers 在进行 3D 变换时使用屏幕中心作为消失点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11855914/
我是一名优秀的程序员,十分优秀!