2016-01-27 15 views
6

Hier ist meine Klasse Etikett oder Text hinzufügen und es wird einen Kreis zeichnen, sieht es wie folgt aus:Wie in zu CAShapeLayer

enter image description here

class OvalLayer: CAShapeLayer { 

    let animationDuration: CFTimeInterval = 0.3 

    override init() { 
     super.init() 
     fillColor = Colors.green.CGColor 
     path = ovalPathSmall.CGPath 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 


    var ovalPathStart: UIBezierPath { 
     let path = UIBezierPath(ovalInRect: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0)) 

     return path 
    } 
} 

Jetzt brauche ich einen Text zu Mitte hinzufügen von diesem Kreis habe ich versucht, es auf Google zu finden, aber nichts, das gut funktioniert. Ich bin mir nicht sicher, ob es möglich ist oder nicht, kann mir jemand helfen, wenn es möglich ist?

+1

Haben Sie hatten ein Blick auf 'CATextLayer'? https://developer.apple.com/library/prerelease/mac/documentation/GraphicsImaging/Reference/CATextLayer_class/index.html – Hamish

+0

ja, ich habe versucht, ich konnte nicht finden, wie Sublayer von CATextLayer zu CAShapeLayer –

Antwort

5

Ich denke, man CATextLayer als Unterschicht zu CALayer hinzufügen soll ... Das fein auf diese Weise funktioniert: versuchen CAShapeLayer erste Zugabe, und dann CATextLayer (zu gleichen CALayer übergeordneter Ebene), zum Beispiel in folgenden Reihenfolge ...

// assume self - is UIView instance 

self.layer.addSublayer(shapedLayer) // shapedLayer - CAShapeLayer instance 
self.layer.addSublayer(textLayer) // textLayer - CATextLayer instance 
+0

hinzufügen Vielen Dank für Ihre Antwort, ich habe es ausprobiert, nichts erscheint, können Sie mehr Platz beschreiben? –

+0

@roledeneJKS: Können Sie bitte kommentieren, wie diese Antwort für Sie funktioniert hat? – SHN

+0

@roledeneJKS: Sie müssen den Rahmen für textLayer setzen, bevor Sie ihn hinzufügen –

1

Sie müssen nur die Mitte Ihrer UIBezierPath und ein Etikett oder eine CATextLayer zu Ihrer aktuellen Schicht hinzufügen. Jetzt

let center : CGPoint = CGPoint(x: CGRectGetMidX(ovalPathStart.bounds), y: CGRectGetMidX(ovalPathStart.bounds)) 

, erstellen Sie eine UILabel oder CATextLayer und stellen Sie die Mitte.

+0

Ich kann einen CATextLayer erstellen, aber nicht verschieben. Ich habe versucht, Grenzen, Rahmen, Position usw. zu ändern, und es sitzt nur in der oberen linken Ecke der Ebene, zu der ich es hinzugefügt habe .... es weigert sich, über meine Grafik zu bewegen. Wie verschiebst du den CATextLayer über einen Bézier-Pfad? – Dewey

2

Swift 3,0

let label = UILabel() 
label.font = UIFont(name: "Helvetica-Bold", size: 12) 
label.frame = CGRect(x: OvalLayer.frame.origin.x + (circleWidth/2), y: OvalLayer.frame.origin.y, width: OvalLayer.bounds.width, height: OvalLayer.bounds.height) 
label.text = "Hello" 
label.textColor = UIColor.red 
label.isHidden = false 

OvalLayer.addSublayer(label.layer) 
+3

Dies funktioniert nicht. Der Text erscheint nie (Swift 4/XCode 9) – rommex

0

Text auf CAShapeLayer CATextLayer Mit

Hier bin ich CAShapeLayer Objekt erstellen, und ich bin das Hinzufügen CATextLayer zu CAShapeLayer Hier bedeutet numberOfArcsCount einige 8

  CAShapeLayer *progressLayer = [[CAShapeLayer alloc] init]; 
      [progressLayer setPath:bezierPath.CGPath]; 


      CATextLayer* text = [CATextLayer new]; 
      for (int i = 1; i <= numberOfArcs.count; i++) { 
      text.string = [NSString stringWithFormat:@"%i", i]; 
      text.font = (__bridge CFTypeRef _Nullable)([UIFont fontWithName:@"akaChen" size:42]); 
      text.font = (__bridge CFTypeRef _Nullable)([UIFont boldSystemFontOfSize:15]); 
      text.fontSize=25; 
      text.frame = CGRectMake(0,0,40,40); 
      text.position = CGPointMake(CGRectGetMidX(progressLayer.frame) ,CGRectGetMidY(progressLayer.frame)); 

      CGFloat vert = CGRectGetMidY(progressLayer.frame)/CGRectGetHeight(text.frame); 

      text.anchorPoint = CGPointMake(0.5, vert); 
      text.alignmentMode = kCAAlignmentCenter; 
      text.foregroundColor = [[UIColor whiteColor] CGColor]; 

      [progressLayer addSublayer:text]; 
     } 
Verwandte Themen