我正在使用 CATransform3D 转换将伪 3D 透视效果应用于视图。
我正在使用 iPhone 4 中的陀螺仪来控制变换的参数。
我正在转换的视图有一些子视图:
结果是这样的:
我的下一个任务是防止子视图在主视图被转换时被转换,或者应用逆变换以使子视图不受影响。
我的目标是让每个子视图垂直于父视图,给人一种它们是“站立”的印象。
我用于转换的代码:
- (void)update:(NSTimer *)timer
{
roll = [[[_manager deviceMotion] attitude] roll];
pitch = [[[_manager deviceMotion] attitude] pitch];
yaw = [[[_manager deviceMotion] attitude] yaw];
CALayer *layer = [self.view layer];
CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, -90 * M_PI / 180.0f, 0.0f, 0.0f, 1.0f); // make landscape again
rotationAndPerspectiveTransform.m34 = 1.0 / -500; // apply the perspective
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, roll, 1.0f, 0.0f, 0.0f);
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, yaw, 0.0f, 0.0f, 1.0f);
[layer setTransform:rotationAndPerspectiveTransform];
}
我尝试了以下代码,试图通过围绕 Y 轴对子视图应用 90 度透视旋转来反转变换:
for (UIView *subview in [self.view subviews])
{
CALayer *sublayer = [subview layer];
//CATransform3D inverseTransformation = [sublayer transform];
CATransform3D inverseTransformation = CATransform3DIdentity;
rotationAndPerspectiveTransform.m34 = 1.0 / -500; // apply perspective
inverseTransformation = CATransform3DRotate(inverseTransformation, 90 * M_PI / 180.0f, 0.0f, 1.0f, 0.0f);
[sublayer setTransform:inverseTransformation];
}
但是所有这一切都成功地使子视图消失了。如果我尝试使用图层中的现有变换[sublayer transform]
并对其应用 3d 旋转,则子视图会闪烁,但不会旋转。
我对矩阵数学的了解不是很好,所以我不知道这是否是正确的方法。
如何使子视图垂直于超级视图?