将 UILabel 的层添加到另一个层(单独的 UIView)
Posted
技术标签:
【中文标题】将 UILabel 的层添加到另一个层(单独的 UIView)【英文标题】:Adding a UILabel's layer to another layer (Separate UIView) 【发布时间】:2013-04-26 13:04:31 【问题描述】:我试图理解为什么我不能将 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 的子层层次结构中?
感谢您的帮助
【问题讨论】:
【参考方案1】:numberLayer 是一个指向 numberLabel.layer 的指针,所以它是一个实例——一个层或 UIView 的一个实例只能是一个父级的子级,而不是多个。
【讨论】:
【参考方案2】:CALayer 符合 NSCoding 协议,因此您可以对现有的 CALayer 实例进行编码,然后通过从第一个实例中解码数据来创建新的 CALayer 实例。
-
尝试阅读this。
还有this answer 以及在第一次引用之后。
【讨论】:
以上是关于将 UILabel 的层添加到另一个层(单独的 UIView)的主要内容,如果未能解决你的问题,请参考以下文章