旋转UIView以提供透视

时间:2012-10-16 09:11:29

标签: xcode uiview rotation layer perspective

我想更改UIViewViewcontroller的视角。我认为我必须转换这个UIView层,但我不知道如何。

我尝试了以下代码,但它无法正常工作

UIView *myView = [[self subviews] objectAtIndex:0];
CALayer *layer = myView.layer;
CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
rotationAndPerspectiveTransform.m34 = 1.0 / -500;
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 45.0f * M_PI / 180.0f, 0.0f, 1.0f, 0.0f);
layer.transform = rotationAndPerspectiveTransform;

我也试过以下代码:

-(void)drawRect:(CGRect)rect {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGAffineTransform transform = CGAffineTransformIdentity;
    transform.b = -0.1;
    transform.a = 0.9;
    CGContextConcatCTM(ctx,transform);
    // do drawing on the context
}

这也是:

CALayer *layerA = [[self.view.layer sublayers] objectAtIndex:0];


    layerA.transform = CATransform3DConcat(layerA.transform, CATransform3DMakeRotation(DEGREES_TO_RADIANS(45),1.0,0.0,0.0)

他们都没有工作。如何更改UIView的视角?

换句话说,我会举一个例子。想象这个示例代码,一个旋转饼RotationPie sample。我想在x或z asis中改变它的角度。

1 个答案:

答案 0 :(得分:3)

你的第一个解决方案适用于我。它看起来像这样:

enter image description here

如果你的代码在你的结尾不起作用,你能展示你的全班代码吗?

修改

好的,我已经重新配置了提供的代码示例,以显示它是如何实现的:

(在此下载更新的代码示例:http://www.speedyshare.com/dz469/download/Wheel-demo.zip

它看起来像这样:

enter image description here

我只将转换应用于基础子视图。作为该视图的子视图的所有视图也将被转换。如果你想让相应的子视图有不同的转换 - 它会更难,因为,那么你必须考虑父视图转换,计算新的转换 - 它可能变得非常困难。

但我做了一些简单的多视图级别转换。例如 - 为了实现效果,该视图可以缩放,移动和旋转:

  • 我已将移动转换应用于parentView
  • 我已将旋转变换应用于parentViews的第一个子视图;
  • 我已将比例转换应用于parentViews的第一个子视图子视图。

修改

好的,我已经重新配置了提供的代码示例,以显示它是如何可能的,以便将轮子保持在转换位置:

(在这里下载更新的代码示例: http://www.speedyshare.com/5d8Xq/download/Wheel-demo2.zip

问题是 - 在这种情况下,我正在为车轮本身添加变换 - 而且看起来,Wheel也是基于变换。因此 - 当你触摸它时 - 它取代了现有的变换并应用它自己的(当用户滑动轮时旋转箭头)。

所以 - 在我们与它交互时保持透视 - 我们需要另一个视图层。

我创建了一个新视图(让我们称之为父视图),并将wheel作为子视图添加到此视图中。

然后我将转换应用于父View而不是wheel。它的工作原理!

我希望它有所帮助,你现在更了解转换:)