1

我试图理解为什么我不能将 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];
}

但是,如果我要创建一个 CATextLayer,它就可以正常工作。(见注释掉的代码)

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

谢谢您的帮助

4

2 回答 2

1

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

于 2013-04-26T13:40:05.590 回答
0

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

  1. 试试看这个
  2. 在第一次参考之后也是这个答案。
于 2013-04-26T15:47:04.830 回答