Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UIBezierPath not rotating with applyTransform method

I am creating 3 rectangles using UIBezierPath, which I want to rotate 45 degrees. I use the applyTransform method and pass CGAffineTransformMakeRotation. I have looked all over Google, and none of the implementations that I have dound worked. Does anyone see what I am doing wrong? Here is my code:

#define DEGREES_TO_RADIANS(x) (M_PI * (x) / 180.0)

@implementation BaseballDiamondView

// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    CGRect superViewFrame = self.bounds;
    [[UIColor whiteColor] setFill];

    // draw third base
    UIBezierPath *thirdBasePath = [UIBezierPath bezierPathWithRect:CGRectMake(2.0, 4.0, 7.0, 7.0)];
    [thirdBasePath fill];

    // draw second base
    UIBezierPath *secondBasePath = [UIBezierPath bezierPathWithRect:CGRectMake((superViewFrame.size.width / 2.0) - 3.0, 2.0, 7.0, 7.0)];
    [secondBasePath fill];

    // draw first base
    UIBezierPath *firstBasePath = [UIBezierPath bezierPathWithRect:CGRectMake(superViewFrame.size.width - 5.0, 4.0, 7.0, 7.0)];
    [firstBasePath fill];

    // transform the rectangles
    NSInteger degreeToRotate = 45;
    [firstBasePath applyTransform:CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(degreeToRotate))];
    [secondBasePath applyTransform:CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(degreeToRotate))];
    [thirdBasePath applyTransform:CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(degreeToRotate))];
}
like image 908
Chandler De Angelis Avatar asked May 29 '14 22:05

Chandler De Angelis


1 Answers

You create your bezier paths, fill them, then rotate them. Then discard the bezier paths.

The fact that you rotate them is meaningless because you don't rotate them until after you fill them. Change the order so you create your paths, rotate them, then fill them.

Note that since you rotate all your paths by the same amount, you could create a single affine transform and apply that same transform to all 3 paths:

UIBezierPath *thirdBasePath = [UIBezierPath bezierPathWithRect:CGRectMake(2.0, 4.0, 7.0, 7.0)];

UIBezierPath *secondBasePath = [UIBezierPath bezierPathWithRect:CGRectMake((superViewFrame.size.width / 2.0) - 3.0, 2.0, 7.0, 7.0)];

UIBezierPath *firstBasePath = [UIBezierPath bezierPathWithRect:CGRectMake(superViewFrame.size.width - 5.0, 4.0, 7.0, 7.0)];
NSInteger degreeToRotate = 45;
CGAffineTransform transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(degreeToRotate));
[firstBasePath applyTransform: transform];
[secondBasePath applyTransform: transform];
[thirdBasePath applyTransform: transform];

[thirdBasePath fill];
[secondBasePath fill];
[firstBasePath fill];
like image 162
Duncan C Avatar answered Sep 28 '22 15:09

Duncan C