Why does a view changes position when rotating it using CGAffineTransformMakeRotation

前端 未结 3 1343
执念已碎
执念已碎 2021-02-12 21:35

I have the following super simple animation, I\'m basically rotating a view 2 radians from its original angle/center, it rotates fine my only misunderstanding is why does the vi

相关标签:
3条回答
  • 2021-02-12 22:17

    The "anchor" of CGAffineTransformMakeRotation is the X,Y of the view. You can try this:

    CGPoint center = self.someView.center;
    [UIView animateWithDuration:1.0 animations:^{
        self.someView.transform = CGAffineTransformMakeRotation( 2 );
        self.someView.center = center;
    }];
    
    0 讨论(0)
  • 2021-02-12 22:25

    You need to set the anchor point of your view to rotate around.

    self.somview.layer.anchorPoint = CGPointMake(0.5, 0.5);
    

    Then start the rotation.
    From Apple documentations

    @property(nonatomic) CGAffineTransform transform
    Changes to this property can be animated. Use the beginAnimations:context: class method to begin and the commitAnimations class method to end an animation block. The default is whatever the center value is (or anchor point if changed) Link: https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html#//apple_ref/occ/instp/CALayer/anchorPoint

    enter image description here
    image from here http://www.raywenderlich.com/9864/how-to-create-a-rotating-wheel-control-with-uikit
    - As you see the anchor point is the point with the value from 0.0 - 1.0 for X and Y when you rotate the rotation will be around these points
    NOTE: you need to import QuartzCore

    0 讨论(0)
  • 2021-02-12 22:30

    I am adding another answer due to @fs_tigre request. The problem is with the auto layouts in your xib file, unfortunately is it unknown why that affects the transform.
    Now here is the steps I did to solve the issue:

    1- first you need to get rid off your auto layout (yes, you have to)
    uncheck Use Autolayout
    uncheck Use Autolayout

    2- remove all constraints and autoresizing masks for your view that will be rotated, as in the screenshot (Here I have my blue box, see on the right autoresizing, nothing is selected)
    enter image description here

    I have made some changes for your rotation's code

    self.someView.layer.anchorPoint = CGPointMake(0.5, 0.5);
        // one degree = pi/180. so...
        // rotate by 90
        CGFloat radians = (M_PI/180) * 90;
        [UIView animateWithDuration:1.0 animations:^{
            self.someView.transform = CGAffineTransformRotate(self.someView.transform, radians);
        }];
    

    Click rotate and see the magic :)

    0 讨论(0)
提交回复
热议问题