启用颜色混合图层后,是否可以将带有非英文字符的 UILabel 设置为绿色?

Is it possible to make UILabel with non-English characters green when Color Blended Layer is enabled?

我有一个带有自定义单元格的 table 视图,当在模拟器中选中 Color Blended Layer 时,我尝试通过将单元格内的所有子视图设为绿色来优化它。

当单元格中 UILabel 的背景设置为白色时:

let title = UILabel()
contentView.addSubview(title)
title.background = UIColor.whiteColor()
title.text = "Hi, how are you?"

这个UILabel子视图在模拟器中会变成绿色,这很好。但是,如果我将文本更改为一些中文:

title.text = "你好"

UILabel 子视图将变为红色。此 SO post 提供了有关情况的一些解释。实际上有解决方案吗?

也许您可以根据使用的字体检查等宽字符(西方)与比例字符(中文)。

等宽字符是 8 位,而比例字符是 16 位。我不知道 Swift 如何检查字节大小,所以我无法提供任何代码。

Apple 的 Swift 编程指南可以提供帮助。检查标题为:Unicode Representations of Strings 的部分。

不得不说这是Apple内部实现的。我们不应该/(可能)不能fiddle。毕竟你看到的'colors'只是层结构的表示。您所附问题的答案是一个很好的解释。

我建议不要计划任何过早的优化。毕竟,即使你确实感觉到性能提升,'Color Blended Layer' 也很难看,不能应用于真实设备。或者干脆尽量不去关注!

编辑:

这是苹果模拟器的截图,如果苹果可以接受,你也可以接受!

使用 CATextLayer 而不是 UILabel。并且不要忘记将其 opaque 属性 设置为 true.

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)

        // You should definitely put layer handling logic into 
        // UITableViewCell subclass. I'm omitting it for clarity
    let layer = cell.contentView.layer

    let textLayer = CATextLayer()
    textLayer.string = "你好"
    textLayer.bounds = CGRect(x: 0, y: 0, width: 100, height: 50)
    textLayer.position = CGPoint(x: 50, y: 25)
    textLayer.opaque = true

    layer.addSublayer(textLayer)

    return cell
}

UPD: 如果黑色背景不是您想要的,问题会变得有点棘手,但仍然可以解决。

您只需要在绘图机制中注入两行代码即可。有两种方法可以实现:

  • 使用 delegateCALayer

  • 制作 CATextLayer 的子class。

在我们的案例中,我认为后者更可取。因此,在下面的示例中使用 class:

而不是 CATextLayer
class OpaqueTextLayerWithCustomizableBackgroundColor: CATextLayer {
    override func drawInContext(ctx: CGContext) {
        if let color = backgroundColor {
            CGContextSetFillColorWithColor(ctx, color)
            CGContextFillRect(ctx, bounds);
        }
        super.drawInContext(ctx)
    }
}

检查你的 textlayer.string 第一个字母是英文还是其他字母

 NSMutableArray*arrAlphabets;
    arrAlphabets=[NSMutableArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H",@"I",@"J",@"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",@"T",@"U",@"V",@"W",@"X",@"Y",@"Z",nil]]

然后 Inside Tableview cell for row at indexpath 方法:

NSString *str=[textlayer.string substringToIndex:1];
if(str isEqualToString:arrAlphabets)   //use for loop to run arralphabets
{
    //do your code to maintail the layer color .
}

希望这个概念对你有帮助:)

仅供参考,XIB(个人偏好)或代码中的三个步骤。

  1. set opaque = YES
  2. backgroundColor = a solid color
  3. clipsToBound = YES

然后非英语 UILabel 将渲染通过一次,为绿色。