Tj3n
Tj3n

Reputation: 39

iOS - Draw Bezier Path in Subview

im learning CoreGraphic and want to make a simple game, but stuck on drawing thing with bezier path, i wanted to draw a triangle inside a subview, but it always come out wrong, i want it to fit 1/4 of the square view

My code:

UIBezierPath* trianglePath = [UIBezierPath bezierPath];
[trianglePath moveToPoint:CGPointMake(0, 0)];
[trianglePath addLineToPoint:CGPointMake(self.mainView.frame.size.width/2, self.mainView.frame.size.height/2)];
[trianglePath addLineToPoint:CGPointMake(self.mainView.frame.size.width, 0)];
[trianglePath closePath];

CAShapeLayer *triangleMaskLayer = [CAShapeLayer layer];
[triangleMaskLayer setPath:trianglePath.CGPath];

UIView *firstView = [[UIView alloc] initWithFrame:CGRectMake(0,0, self.mainView.frame.size.width, self.mainView.frame.size.height)];

firstView.backgroundColor = [UIColor colorWithWhite:.75 alpha:1];
firstView.layer.mask = triangleMaskLayer;
[self.mainView addSubview:firstView];

It look like this: enter image description here

Upvotes: 2

Views: 2266

Answers (1)

Stephane JAIS
Stephane JAIS

Reputation: 1433

If the dimensions are incorrect, you probably are creating the triangle before AutoLayout has done its job.

To ensure your self.mainView has the correct size, create your triangle in your controller viewDidLayoutSubviews method.

Also mind that viewDidLayoutSubviews may be called multiple times.

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void) viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    if (self.mainView.subviews.count == 0) {
        UIBezierPath* trianglePath = [UIBezierPath bezierPath];
        [trianglePath moveToPoint:CGPointMake(0, 0)];
        [trianglePath addLineToPoint:CGPointMake(self.mainView.frame.size.width/2, self.mainView.frame.size.height/2)];
        [trianglePath addLineToPoint:CGPointMake(self.mainView.frame.size.width, 0)];
        [trianglePath closePath];

        CAShapeLayer *triangleMaskLayer = [CAShapeLayer layer];
        [triangleMaskLayer setPath:trianglePath.CGPath];

        UIView *firstView = [[UIView alloc] initWithFrame:CGRectMake(0,0, self.mainView.frame.size.width, self.mainView.frame.size.height)];

        firstView.backgroundColor = [UIColor colorWithWhite:.75 alpha:1];
        firstView.layer.mask = triangleMaskLayer;
        [self.mainView addSubview:firstView];

    }
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

Upvotes: 3

Related Questions