2016-09-14 2 views
0

Я искал с помощью BezierPath и заметил то, что я не могу понять. Это код-Рисунок bezierPath

UIBezierPath *path = [UIBezierPath new]; 

CGSize screenDimensions = CGSizeMake([UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height); 

CGPoint firstPoint = CGPointMake(screenDimensions.width/2, screenDimensions.height/2); 
CGPoint secondPoint = CGPointMake(screenDimensions.width/2 + 10, screenDimensions.height/2 + 10); 
CGPoint thirdPoint = CGPointMake(screenDimensions.width/2 - 10, screenDimensions.height/2 + 10); 

[path moveToPoint:firstPoint]; 
[path addLineToPoint:secondPoint]; 
[path addLineToPoint:thirdPoint]; 
[path addLineToPoint:firstPoint]; 

[path closePath]; 

CAShapeLayer *tempLayer = [CAShapeLayer new]; 
[tempLayer setPath:path.CGPath]; 

UIView *tempView = [[UIView alloc] initWithFrame:CGRectMake(screenDimensions.width/2 - 30, screenDimensions.height/2 - 30, 100, 100)]; 

// UIView *tempView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 

[tempView setBackgroundColor:[UIColor blueColor]]; 
tempView.layer.mask = tempLayer; 
[self.view addSubview:tempView]; 

Если я запускаю выше блок кода, ничего не рисуется на UIView, который добавляется на экране. Но если бы я прокомментировал текущий «tempView» и раскомментировал выделенное в настоящее время распределение, он отлично рисовал бы на экране. Может ли кто-нибудь указать, что я делаю неправильно здесь, когда устанавливаю фрейм или это что-то еще?

ответ

0

Это простая проблема.

Скажем, размеры экрана составляют 320x480 (и старый iPhone). Это означает, что firstPoint будет 160, 240.

В текущем коде рамка вашего представления 130, 210, 100, 100. Его ширина и высота равны 100.

Слой формы будет нарисован относительно границ обзора, а не его рамки. Итак, что касается пути слоя и безье, границы обзора равны 0, 0, 100, 100. Поскольку firstPoint находится за пределами этих границ, он не появляется. Это на самом деле нарисовано, но вне видимых границ зрения.

При переключении двух линий, которые создают представление, рамка представления становится 0, 0, 320, 480. Это означает, что его границы также равны 0, 0, 320, 480. Теперь вид намного больше, а слой и путь безьего подходят и видны.

Правильное решение состоит в том, чтобы создать координаты пути безье, исходя из размера вида, к которому он будет применен, а не от размера экрана. Таким образом, путь безье будет вписываться в его представление независимо от того, насколько он велик.

Больше как это:

CGSize screenDimensions = CGSizeMake([UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height); 

UIView *tempView = [[UIView alloc] initWithFrame:CGRectMake(screenDimensions.width/2 - 30, screenDimensions.height/2 - 30, 100, 100)]; 

// UIView *tempView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 

UIBezierPath *path = [UIBezierPath new]; 

CGPoint firstPoint = CGPointMake(tempView.bounds.size.width/2, tempView.bounds.size.height/2); 
CGPoint secondPoint = CGPointMake(tempView.bounds.size.width/2 + 10, tempView.bounds.size.height/2 + 10); 
CGPoint thirdPoint = CGPointMake(tempView.bounds.size.width/2 - 10, tempView.bounds.size.height/2 + 10); 

[path moveToPoint:firstPoint]; 
[path addLineToPoint:secondPoint]; 
[path addLineToPoint:thirdPoint]; 
[path addLineToPoint:firstPoint]; 

[path closePath]; 

CAShapeLayer *tempLayer = [CAShapeLayer new]; 
[tempLayer setPath:path.CGPath]; 

[tempView setBackgroundColor:[UIColor blueColor]]; 
tempView.layer.mask = tempLayer; 
[self.view addSubview:tempView]; 
+0

Ahh спасибо! Это решило проблему, я понятия не имел, что CAShapeLayer будет использовать границы своего применения! – Rikh

+0

Было бы ужасно и запутанно, если бы это не так. – rmaddy

Смежные вопросы