2016-01-27 17 views
6

Đây là lớp học của tôi và nó sẽ vẽ một vòng tròn, nó trông như thế này:Làm thế nào để thêm nhãn hoặc văn bản trong để 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 
    } 
} 

Bây giờ tôi cần phải thêm một văn bản vào giữa của vòng kết nối này, tôi đã cố gắng tìm nó trên google nhưng không có gì hoạt động tốt. Tôi không chắc chắn nếu nó có thể hay không, bất cứ ai có thể giúp tôi nếu nó có thể?

+1

Quý vị có nhìn vào 'CATextLayer'? https://developer.apple.com/library/prerelease/mac/documentation/GraphicsImaging/Reference/CATextLayer_class/index.html – Hamish

+0

vâng, tôi đã thử, tôi không thể tìm thấy cách thêm lớp con của CATextLayer vào CAShapeLayer –

Trả lời

5

Tôi đoán bạn nên thêm CATextLayer như một lớp con để CALayer ... Đó là hoạt động tốt như vậy: hãy thử thêm CAShapeLayer đầu tiên, và sau đó CATextLayer (với cùng CALayer lớp cha mẹ), ví dụ theo thứ tự sau đây ...

// assume self - is UIView instance 

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

cảm ơn bạn đã trả lời của bạn, tôi đã thử điều này, không có gì xuất hiện, bạn có thể mô tả thêm địa điểm không? –

+0

@roledeneJKS: Bạn có thể vui lòng nhận xét câu trả lời này có hiệu quả với bạn không? – SHN

+0

@roledeneJKS: bạn phải đặt khung cho textLayer trước khi thêm nó –

1

Bạn chỉ cần lấy trung tâm của UIBezierPath và thêm nhãn hoặc CATextLayer vào lớp hiện tại của mình.

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

Bây giờ, tạo ra một trung tâm UILabel hoặc CATextLayer và thiết lập.

+0

Tôi có thể tạo một CATextLayer nhưng không di chuyển nó. Tôi đã thử thay đổi giới hạn, khung hình, vị trí, vv và nó chỉ nằm ở góc trên cùng bên trái của lớp mà tôi đã thêm nó .... nó từ chối di chuyển trên đồ họa của tôi. Làm thế nào để bạn di chuyển CATextLayer trên một con đường Bezier? – 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

Điều này không hoạt động. Văn bản không bao giờ xuất hiện (Swift 4/XCode 9) – rommex

0

Văn bản trên CAShapeLayer Sử dụng CATextLayer

Ở đây tôi tạo đối tượng CAShapeLayer và tôi đang bổ sung thêm CATextLayer để CAShapeLayer Đây numberOfArcsCount nghĩa là một số 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]; 
     } 
Các vấn đề liên quan