2015-04-14 54 views
7

我是使用UIBezierPaths繪製形狀的全新軟件。到目前爲止,我發現的所有例子都涉及首先繼承一個視圖,然後覆蓋方法並在那裏進行繪圖,但是我一直無法找到任何能夠絕對肯定地說明這是否是唯一繪製方法的方法UIBiew內的UIBezierPaths,或者如果這只是最實用的方法。在沒有子類的情況下在UIView中繪製UIBezierPaths?

是否有任何其他方式(除了swizzling)在UIView中繪製一個UIBezierPath而無需繼承它?

回答

15

另一種方式來繪製貝塞爾路徑不使用的drawRect是使用CAShapeLayers。將形狀圖層的路徑屬性設置爲從貝塞爾路徑創建的CGPath。將形狀圖層添加爲視圖圖層的子圖層。

UIBezierPath *shape = [UIBezierPath bezierPathWithOvalInRect:self.view.bounds]; 
    CAShapeLayer *shapeLayer = [CAShapeLayer layer]; 
    shapeLayer.path = shape.CGPath; 
    shapeLayer.fillColor = [UIColor colorWithRed:.5 green:1 blue:.5 alpha:1].CGColor; 
    shapeLayer.strokeColor = [UIColor blackColor].CGColor; 
    shapeLayer.lineWidth = 2; 

    [self.view.layer addSublayer:shapeLayer]; 
+0

這看起來就像我正在尋找的東西!希望我昨天知道這個= P是否有任何無法預料的UIBezierPath的限制或功能,這樣做時無法訪問? – n00neimp0rtant

+0

@ n00neimp0rtant我不知道有什麼具體的限制,也不知道記憶的後果是什麼,特別是如果你想要有多個層次的話。你將不得不做一些分析找出。 – rdelmar

0

您可以:1)將UIBezierPaths渲染到圖像上下文中。 2)添加UIImageView作爲視圖的子視圖,並使用渲染圖像設置圖像屬性。 事情是這樣的:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.imageView = [[UIImageView alloc] initWithFrame:self.view.bounds]; 
    [self.view addSubview:self.imageView]; 
    [self drawPaths]; 
} 

- (void)drawPaths { 
     UIGraphicsBeginImageContext(self.view.bounds); 
     //draw... 
     self.imageView.image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
} 
+1

所以,你將基本上呈現貝塞爾路徑作爲一個UIImage,然後在一個UIImageView顯示它?在某些情況下,這可能會比子類更好,但它看起來相當昂貴,特別是在視圖重新調整大小時重新繪製。 – n00neimp0rtant

+0

但答案是完全正確的,並有效。 – ninjaproger

5

接受的答案的斯威夫特版本:

let shape = UIBezierPath(ovalInRect: view.bounds) 
    let shapeLayer = CAShapeLayer() 
    shapeLayer.path = shape.CGPath 
    shapeLayer.fillColor = UIColor(red: 0.5, green: 1, blue: 0.5, alpha: 1).CGColor 
    shapeLayer.strokeColor = UIColor.blackColor().CGColor 
    shapeLayer.lineWidth = 2.0 
    view.layer.addSublayer(shapeLayer) 
0

斯威夫特3接受的答案:

let shape = UIBezierPath(ovalIn: view.bounds) 
let shapeLayer = CAShapeLayer() 
shapeLayer.path = shape.cgPath 
shapeLayer.fillColor = UIColor(red: 0.5, green: 1, blue: 0.5, alpha: 1).cgColor 
shapeLayer.strokeColor = UIColor.black.cgColor 
shapeLayer.lineWidth = 2.0 
view.layer.addSublayer(shapeLayer) 
相關問題