2015-04-14 16 views
7

Şekil çizmek için UIBezierPaths'ı kullanıyorum. Şimdiye kadar bulduğum tüm örnekler ilk önce bir alt sınıflamayı, sonra da drawRect: yöntemini geçersiz kılmayı ve çizimi oraya dahil etmeyi içerir, ancak bu, çizmenin tek yolu olup olmadığını kesin bir kesinlik ile söyleyen hiçbir şey bulamadım. UIView içinde UIBezierPaths, ya da bu sadece en pragmatik yol ise.Alt sınıflandırma olmadan UIView içinde UIBezierPaths çizin?

UIView'de bir alt sınıflama olmadan bir UIBezierPath çizmek için başka bir yol var mı?

cevap

15

drawRect kullanmadan Bezier yollarını çizmek için başka bir yol CAShapeLayers kullanmaktır. Bir şekil katmanının yol özelliğini, bezier yolundan oluşturulan bir CGPath olarak ayarlayın. Görünüm katmanını görünümün katmanına bir alt katman olarak ekleyin.

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

Bu sadece aradığım şey gibi görünüyor! Keşke bunu dün bilmeliydim = P UIBezierPath'in bu şekilde yapıldığında erişemeyeceği öngörülemeyen herhangi bir kısıtlama veya özellik var mı? – n00neimp0rtant

+0

@ n00neimp0rtant Herhangi bir belirli sınırlama bilmiyorum, ne de özellikle birden çok katmana sahip olmak istediğinizde bellek sonuçlarının ne olabileceğinin farkında değilim. Öğrenmek için bir profil yapman gerekecek. – rdelmar

0

Yapabilecekleriniz: 1) UIBezierPath'leri görüntü içeriğine dönüştürmek. 2) UIImageView'ınızı görünümünüzün alt görünümü olarak ekleyin ve görüntü özelliğini görüntülenen görüntü ile ayarlayın. Böyle şey:

- (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

Yani aslında bir UIImage olarak bezier yolu işlemek ve sonra bir UIImageView görüntülemek ediyorum ? Bu, bazı durumlarda alt sınıflamadan daha iyi olabilir, ancak özellikle bir görünüm yeniden boyutlandırıldığında yeniden çizilirse, oldukça pahalı görünebilir. – n00neimp0rtant

+0

Ama cevap tamamen doğru ve çalışıyor. – ninjaproger

5

kabul cevabın Swift sürümü:

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

Swift 3 kabul cevap:

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) 
İlgili konular