启用颜色混合图层后,是否可以将带有非英文字符的 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: 如果黑色背景不是您想要的,问题会变得有点棘手,但仍然可以解决。
您只需要在绘图机制中注入两行代码即可。有两种方法可以实现:
使用 delegate
或 CALayer
或
制作 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(个人偏好)或代码中的三个步骤。
- set opaque = YES
- backgroundColor = a solid color
- clipsToBound = YES
然后非英语 UILabel 将渲染通过一次,为绿色。
我有一个带有自定义单元格的 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: 如果黑色背景不是您想要的,问题会变得有点棘手,但仍然可以解决。
您只需要在绘图机制中注入两行代码即可。有两种方法可以实现:
使用
delegate
或CALayer
或制作
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(个人偏好)或代码中的三个步骤。
- set opaque = YES
- backgroundColor = a solid color
- clipsToBound = YES
然后非英语 UILabel 将渲染通过一次,为绿色。