2016-01-27 7 views
6

करने के लिए लेबल या पाठ जोड़ने के लिए कैसे यहाँ मेरी कक्षा है और यह एक वृत्त होगा, यह इस तरह दिखता है: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 
    } 
} 

अब मैं उसके बीच में कोई पाठ जोड़ने की जरूरत इस सर्कल के, मैंने इसे Google पर खोजने की कोशिश की लेकिन कुछ भी ठीक काम नहीं करता है। मुझे यकीन नहीं है कि यह संभव है या नहीं, क्या यह संभव है अगर कोई मेरी मदद कर सके?

+1

आप हुई है 'CATextLayer' पर एक नज़र? https://developer.apple.com/library/prerelease/mac/documentation/GraphicsImaging/Reference/CATextLayer_class/index.html – Hamish

+0

हाँ, मैंने कोशिश की, मैं यह नहीं ढूंढ पाया कि CATextLayer के Sublayer को CAShapeLayer –

उत्तर

5

मुझे लगता है कि आप CALayer करने के लिए एक उप-परत ... यही कारण है कि ठीक काम करता है कि जिस तरह से के रूप में CATextLayer जोड़ना चाहिए: निम्न क्रम में CAShapeLayer पहले जोड़ने का प्रयास करें, और उसके बाद CATextLayer (CALayer एक ही करने के लिए माता पिता परत), उदाहरण के लिए ...

// assume self - is UIView instance 

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

पर कैसे जोड़ा जाए आपके उत्तर के लिए धन्यवाद, मैंने इसे आजमाया, कुछ नहीं दिखाई देता, क्या आप जगह का अधिक वर्णन कर सकते हैं? –

+0

@roledeneJKS: क्या आप टिप्पणी कर सकते हैं कि यह उत्तर आपके लिए कैसे काम करता है? – SHN

+0

@roledeneJKS: आपको –

1

आपको बस अपने UIBezierPath का केंद्र प्राप्त करने की आवश्यकता है और अपनी वर्तमान परत में एक लेबल या CATextLayer जोड़ें।

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

अब, एक UILabel या CATextLayer और सेट केंद्र पैदा करते हैं।

+0

मैं एक CATextLayer बनाने में सक्षम हूं लेकिन इसे स्थानांतरित नहीं कर पा रहा हूं। मैंने सीमाओं, फ्रेम, स्थिति इत्यादि को बदलने की कोशिश की है और यह सिर्फ परत के ऊपरी बाएं कोने में बैठता है जिस पर मैंने इसे जोड़ा .... यह मेरे ग्राफिक पर जाने से इंकार कर देता है। आप CATextLayer को बेजियर पथ पर कैसे ले जाते हैं? – Dewey

2

CAShapeLayer पर स्विफ्ट 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

यह काम नहीं करता है। पाठ कभी प्रकट नहीं होता है (स्विफ्ट 4/एक्सकोड 9) – rommex

0

पाठ CATextLayer

यहाँ मैं हूँ CAShapeLayer वस्तु बना सकते हैं और मैं CAShapeLayer को CATextLayer द्वारा जोड़ा जा रहा का उपयोग करते हुए यहाँ numberOfArcsCount का मतलब है कुछ 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]; 
     } 
संबंधित मुद्दे