我读了thisthis,但是它们似乎无法解决该问题。 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。一方面UIViewUILabel和所有这些只是真正CALayer层次结构之上的薄触感知贴面。 OTOH我在某种程度上依赖于许多甚至没有陈述的假设。

任何人都知道为什么这会进一步恶化,或者更好的是,可以证明它不会吗?

最佳答案

自2013年以来,我一直使用此技术,但它仍然稳定。所以是的,我认为目前是安全的。以前,我是在没有调用iOS 4或5的-display的情况下执行此操作的,在针对较新的SDK进行编译时,该显示将不再起作用,因此感谢您提供的建议。

如果您正在寻找其他选项,请在此处获取更多信息:Add text to CALayer

关于ios - 将“被盗”的UILabel层添加到其他CALayer的子层是否安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23171790/

10-13 05:07