Search code examples
xcodeuiviewrotationlayerperspective

Rotate UIView to give perspective


I want to change the perspective of a UIView that is in my Viewcontroller. I think that I have to transform this UIView layer, but I don't know how.

I've tried the following code but it is not working

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;

I've also tried with the following code:

-(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
}

and this too:

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


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

Neither of them worked. How can I change the perspective of a UIView?

In other words, I will put an example. Image this sample code, a rotation Pie RotationPie sample. I would like to change the perpective of it, in the x or z asis.


Solution

  • Your first solution works on my end. It appears like this:

    enter image description here

    Can You show your whole class code, if it doesn't work the same on your end?

    EDIT

    Ok, I've reconfigured provided code example, to show how it is possible:

    (download here updated code example :http://www.speedyshare.com/dz469/download/Wheel-demo.zip)

    And it looks like this:

    enter image description here

    I am only applying transformation to base subview. All views that are as subviews to that view, will be transformed as well. If You want corresponding subview to have different transformation - it will be harder, because, then You must take in consideration parent view transformation, to calculate new one - it can get really difficult.

    But I've done some simple - multi-view level transformations. For example - to achieve effect, that view scales, moves, and rotates:

    • I've applied movement transformation to parentView
    • I've applied rotation transformation to parentViews first subview;
    • I've applied scale transformation to parentViews first subviews subview.

    EDIT

    Ok, I've reconfigured provided code example, to show how it is possible, in order to leave wheel in transformed position:

    (download here updated code example : http://www.speedyshare.com/5d8Xq/download/Wheel-demo2.zip )

    Problem was - in this case, I was adding transformation to wheel itself - and it appears, that Wheel is based on transformations also. Therefore- when You touched it - it replaced existing transformations and applied it's own (to rotate arrows when user swipes wheel).

    So - to leave it in perspective while we interact with it - we need another view layer.

    I created a new View (lets call it parent view), and added wheel as a subview to this view.

    Then I apply transformation to parent View instead of wheel. And it works !

    I Hope it helps and You understand now more about transformations :)