我读了this和this,但是它们似乎无法解决该问题。 this的答案似乎与NSCoding
和 friend 的切线不符,所以...
考虑:
- (NSAttributedString *) attributedStringForText: (NSString *) text {
NSMutableAttributedString* attrStr = [[NSMutableAttributedString alloc] initWithString:text];
UIFont * bigF = [UIFont fontWithName:@"OpenSans-Extrabold" size:20.0f] ;
UIFont * smaF = [UIFont fontWithName:@"OpenSans-Extrabold" size:12.0f] ;
[attrStr addAttribute:NSFontAttributeName value:bigF range:(NSRange){0, 3}] ;
[attrStr addAttribute:NSFontAttributeName value:smaF range:(NSRange){3, 6}] ;
[attrStr addAttribute:NSFontAttributeName value:bigF range:(NSRange){6, [text length]-6}] ;
[attrStr addAttribute:NSBackgroundColorAttributeName value:[UIColor brownColor] range:(NSRange){3, 6}] ;
return attrStr ;
}
- (CALayer *) stealLayerFromUILabelForText: (NSString *) text inRect: (CGRect) bounds {
UILabel * label = [[UILabel alloc] initWithFrame:bounds] ;
label.textColor = [UIColor whiteColor] ;
label.font = [UIFont fontWithName:@"OpenSans-Extrabold" size:20.0f] ;
label.attributedText = [self attributedStringForText:text] ;
[label sizeToFit] ;
[label.layer display] ; // Yup!
return label.layer ;
}
和
- (void) setupLayer: (CALayer *) tileLayer
text: (NSString *) text
index: (NSUInteger) index {
CGRect (^center_rect)(CGRect, CGRect) = ^CGRect (CGRect r, CGRect into) {
CGRect centered = into ;
centered.origin.x += (into.size.width - r.size.width) / 2.0f ;
centered.origin.y += (into.size.height - r.size.height) / 2.0f ;
centered.size = r.size ;
return centered ;
} ;
CALayer * layer = [self stealLayerFromUILabelForText:text inRect:tileLayer.bounds] ;
CGRect frame = center_rect(layer.bounds, tileLayer.bounds) ;
[tileLayer addSublayer:layer] ;
layer.frame = frame ;
}
这有效:
但是我担心我在某种程度上滥用UILabel和CALayer。一方面
UIView
,UILabel
和所有这些只是真正CALayer
层次结构之上的薄触感知贴面。 OTOH我在某种程度上依赖于许多甚至没有陈述的假设。任何人都知道为什么这会进一步恶化,或者更好的是,可以证明它不会吗?
最佳答案
自2013年以来,我一直使用此技术,但它仍然稳定。所以是的,我认为目前是安全的。以前,我是在没有调用iOS 4或5的-display的情况下执行此操作的,在针对较新的SDK进行编译时,该显示将不再起作用,因此感谢您提供的建议。
如果您正在寻找其他选项,请在此处获取更多信息:Add text to CALayer
关于ios - 将“被盗”的UILabel层添加到其他CALayer的子层是否安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23171790/