我想将视图从平行于地面的平面转换为垂直于地面的平面。
有任何想法吗?
要在 3D 中旋转视图,您需要修改transform
视图层的属性。
听起来您想围绕 X 轴旋转视图。我猜你想要透视,靠近观察者的边缘看起来更大,远离观察者的边缘看起来更小。
我们将编写一个辅助函数来进行转换。我们从恒等变换开始:
static CATransform3D transformWithAngle(CGFloat angle) {
CATransform3D transform = CATransform3DIdentity;
然后m34
根据观察者到视图的距离设置变换的分量:
transform.m34 = -1.0f / 300.0f;
如果使用大于 的数字300
,则透视会较弱。如果使用小于 的数字300
,则透视效果会更强。
接下来,添加旋转:
transform = CATransform3DRotate(transform, angle, 1, 0, 0);
然后返回变换:
return transform;
}
假设您要将其应用于名为self.riseView
. 您可能希望旋转围绕视图的底部边缘,因此将图层的锚点设置为底部边缘:
- (void)viewDidLoad {
CGRect frame = self.riseView.frame;
self.riseView.layer.anchorPoint = CGPointMake(0.5f, 1.0f);
self.riseView.frame = frame;
并以 0 的角度初始化图层的变换:
self.riseView.layer.transform = transformWithAngle(0);
}
您可以通过将视图旋转到以下角度来“设置”视图(向下旋转到地平面)-M_PI_2
:
- (IBAction)setButtonWasTapped:(id)sender {
[self animateRiseViewToAngle:-M_PI_2];
}
您可以通过将其旋转到零角度使其“上升”(向上旋转):
- (IBAction)riseButtonWasTapped:(id)sender {
[self animateRiseViewToAngle:0];
}
以下是我们实际制作动画的方式:
- (void)animateRiseViewToAngle:(CGFloat)angle {
[UIView animateWithDuration:2 animations:^{
self.riseView.layer.transform = transformWithAngle(angle);
}];
}