2015-04-14 10 views
7

Sono nuovo di zecca nell'usare UIBezierPaths per disegnare forme. Tutti gli esempi che ho trovato finora coinvolgono prima la sottoclasse di una vista, quindi sovrascrivono il metodo drawRect: e eseguono il disegno all'interno, ma non sono stato in grado di trovare nulla che dica con assoluta certezza se questo è l'unico modo per disegnare UIBezierPath all'interno di un UIView, o se questo è solo il modo più pragmatico.Disegna UIBezierPath in UIView senza sottoclassi?

C'è qualche altro modo (oltre a swizzling) per disegnare un UIBezierPath in un UIView senza sottoclassi esso?

risposta

15

Un altro modo per disegnare tracciati Bezier senza utilizzare drawRect è quello di utilizzare CAShapeLayers. Impostare la proprietà del percorso di un livello forma in un CGPath creato dal percorso di Bezier. Aggiungi il livello forma come sottolivello al livello della vista.

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

Sembra proprio quello che stavo cercando! Vorrei averlo saputo ieri = P Ci sono delle limitazioni impreviste o caratteristiche di UIBezierPath che non saranno accessibili quando lo fai in questo modo? – n00neimp0rtant

+0

@ n00neimp0rtant Non conosco alcun limite specifico, né sono consapevole di quali sarebbero le conseguenze della memoria, specialmente se si desidera avere più livelli. Dovresti fare un po 'di profilazione per scoprirlo. – rdelmar

0

È possibile: 1) rendere UIBezierPaths nel contesto dell'immagine. 2) Aggiungi UIImageView come sottoview della tua vista e imposta la proprietà dell'immagine con l'immagine renderizzata. Qualcosa di simile a questo:

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

così si avrebbe in sostanza rendere il tracciato Bezier come UIImage, e quindi visualizzare in un UIImageView ? In alcuni casi, questo potrebbe essere migliore della sottoclasse, ma sembra piuttosto costoso, specialmente se viene ridisegnato quando una vista viene ridimensionata. – n00neimp0rtant

+0

Ma la risposta è completamente corretta e funziona. – ninjaproger

5

versione Swift di risposta accettata:

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 risposta accettata:

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)