2016-01-27 23 views
6

için etiket veya metin eklemek için ve bir daire çizin edeceğiz Nasıl, bu şuna benzer:İşte benim sınıf 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 
    } 
} 

Şimdi ortada bir metin eklemek gerekir Bu çemberden, onu Google'da bulmaya çalıştım ama hiçbir şey işe yaramıyor. Mümkünse ya da mümkün olmadığından emin değilim, mümkünse bana yardım edebilir mi?

+1

sen oldu mu demektir CATextLayer bir göz atın? https://developer.apple.com/library/prerelease/mac/documentation/GraphicsImaging/Reference/CATextLayer_class/index.html – Hamish

+0

evet, denedim, CATextLayer alt katmanını CAShapeLayer –

cevap

5

Ben ince bu şekilde çalışır CALayer bir alt katın ... olarak CATextLayer eklemek gerekir sanırım: ...

aşağıdaki sırayla örneğin, CAShapeLayer ilk eklemeyi deneyin ve sonra CATextLayer ( CALayer aynı üzere ana tabakası)
// assume self - is UIView instance 

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

'a nasıl ekleyemedim Cevabınız için teşekkür ederim, bunu denedim, hiçbir şey görünmüyor, daha fazla yeri anlatabilir misiniz? –

+0

@roledeneJKS: Bu cevabın sizin için nasıl çalıştığını lütfen yorumluyor musunuz? – SHN

+0

@roledeneJKS: eklemeden önce textLayer için çerçeve ayarlamanız gerekiyor –

1

Sadece UIBezierPath merkezinizin merkezini almanız ve mevcut katmanıza bir etiket veya CATextLayer eklemeniz yeterlidir.

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

Şimdi, UILabel veya CATextLayer ve set merkezini oluşturmak. CATextLayer

İşte

i CAShapeLayer nesne oluşturmak ve i CAShapeLayer için CATextLayer ekliyorum kullanma CAShapeLayer üzerinde

+0

aracılığıyla bir CATextLayer oluşturabiliyorum ama taşıyamam. Sınırları, çerçeveyi, pozisyonu değiştirmeyi denedim ve sadece eklediğim katmanın sol üst köşesinde oturuyordum .... grafiğimin üzerine taşınmayı reddediyor. CATextLayer'ı bir Bezier yolu üzerinde nasıl taşırsınız? – 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

Bu işe yaramıyor. Metin asla görünmüyor (Swift 4/XCode 9) – rommex

0

Buraya Metin numberOfArcsCount bazı 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]; 
     }