2016-09-14 34 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

啊謝謝!這解決了這個問題,我不知道CAShapeLayer會使用它應用的視圖邊界! – Rikh

+0

如果沒有,這將是可怕的和令人困惑的。 – rmaddy