2016-01-27 3 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 в CAShapeLayer –

ответ

5

Я думаю, вы должны добавить CATextLayer в качестве подслоя к CALayer ... Это прекрасно работает таким образом: попробуйте добавить 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: вам нужно установить фрейм для textLayer, прежде чем добавить его –

1

Вам нужно всего лишь получить центр вашего UIBezierPath и добавить ярлык или CATextLayer к вашему текущему слою.

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

Теперь создайте UILabel или CATextLayer и установить центр.

+0

Я могу создать CATextLayer, но не перемещать его. Я попытался изменить границы, рамки, положение и т. Д., И он просто сидит в верхнем левом углу слоя, к которому я добавил его ... он отказывается перемещаться по моей графике. Как вы перемещаете CATextLayer по пути Безье? – 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

Это не работает. Текст никогда не появляется (Swift 4/XCode 9) – rommex

0

Текст на CAShapeLayer Использование CATextLayer

Здесь я создать объект CAShapeLayer и я добавлять CATextLayer к CAShapeLayer Здесь 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]; 
     }