将UILabel的图层添加到另一个图层(单独的UIView)

我试图了解为什么我不能添加一个UILabel的图层作为一个单独的UIView对象的另一层的子图层。

- (void)addNumber:(NSInteger)number toLayer:(CALayer *)layer { UILabel *numberLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds))]; [numberLabel setFont:[UIFont boldSystemFontOfSize:12]]; [numberLabel setText:[NSString stringWithFormat:@"%d", number]]; /* if I change the BackgroundColor to an opaque color it renders as a solid black rect. * No matter what color I choose * Setting it as clear then it is transparent */ [numberLabel setBackgroundColor:[UIColor clearColor]]; [numberLabel setTextAlignment:NSTextAlignmentCenter]; [numberLabel setTextColor:[UIColor blackColor]]; CALayer *numberLayer = numberLabel.layer; /* However creating a CATextLayer is successful CALayer *numberLayer = [CATextLayer layer]; [numberLayer setFont:(__bridge CFTypeRef)([UIFont boldSystemFontOfSize:12])]; [numberLayer setBounds:CGRectMake(0, 0, CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds))]; [numberLayer setString:[NSString stringWithFormat:@"%d", number]]; [numberLayer setAlignmentMode:kCAAlignmentCenter]; [numberLayer setForegroundColor:[[UIColor whiteColor] CGColor]]; */ [numberLayer setPosition:CGPointMake(CGRectGetMidX(layer.bounds), CGRectGetMidY(layer.bounds) + CGRectGetMidY(numberLayer.bounds))]; [layer addSublayer:numberLayer]; } 

但是,如果我要创build一个CATextLayer,它可以正常工作。 (请参阅注释代码)

我的理解是,每个UIView子类都支持一个根CALayer。 我是否应该无法将CALayer的根目录添加到另一个CALayer的子层次结构中?

感谢您的帮助

numberLayer是一个指向numberLabel.layer的指针,所以它是一个单独的实例 – 一个图层或UIView的一个实例只能是一个父级的子元素,而不是多个。

CALayer符合NSCoding协议,因此您可以编码现有的CALayer实例,然后通过解码来自第一个实例的数据创build新的CALayer实例。

  1. 尝试读这个 。
  2. 也是第一次参考之后的答案 。