如何标准化UILabel的各种截断点字符?



我有一个plist文件,我解码它以将数据加载到我的应用程序中。这个plist文件包含字符串类型的值,这些值被映射到UILabel的text属性。

我注意到标签中文本的截断行为并不总是相同的。更具体地说,与我的期望相反,当文本被截断时添加的三个点是两种:一种是...,另一种是⋯⋯这似乎是这个链接中的这个unicode字符。

我检查了UILabel的属性设置,但我找不到任何与此行为相关的设置。

是否有其他人遇到过这个问题并将截断字符标准化为...?

这是描述上述问题的图像。两个标签都有2行,并且在第一行和第二行文本之间插入了新的行转义字符。我发布了一个链接到这张图片,因为显然我没有足够的声誉来发布图片。

UILabel的不同截断字符

在我看来,这是UILabel的一个bug,可能值得打开一个关于它的反馈。

TL;DR:我推荐使用TTTAttributedLabel。


冗长的回答,因为这是一个非常有趣的问题:

UILabel根据被截断的语言脚本使用不同的省略号。正如您所注意到的,对于大多数脚本,它们使用水平省略号()或非常类似的东西。但是对于中文、日文和韩文(CJK),他们使用中线水平省略号(),或者类似的东西。我发现唯一的例外是缅甸语,它用了三个我不认识的圆圈。

在我的测试中,所有以下使用:拉丁语,西里尔语,孟加拉语,阿拉伯语,希伯来语,印地语,泰语,卡纳达语,尼泊尔语和蒙古语(我的孩子。iOS不能布局蒙古语。没有人会布局蒙古语,但它仍然使用)。UILabel甚至用来表示老挝语,尽管我以为是专门用来表示老挝语的,但我想最终所有东西都变成了拉丁语。

UILabel对于CJK和缅甸语如此聪明的问题是,它通过查看被删除的第一个字符来决定专门使用哪个字符。而且它认为SPACE是拉丁文(或者至少不是"special")。

那么该怎么办呢?我的建议可能是使用TTTAttributedLabel,因为它允许您配置截断字符,更重要的是,它是开源的,所以如果它不按您想要的方式工作,您可以修复它。

第二种选择是手动截断文本,使用的技术类似于如何在UILabel中更改截断字符?可能有更好的方法来做到这一点,使用CTFrameGetVisibleStringRange而不是不断地缩小字符串,直到它适合,但我不知道它是否值得的努力。(如果这条路径听起来有用,我可能会写一些东西来实现它。这可能不值得这么麻烦。)

我知道的最后一个选项是将空格字符替换为"等效的"CJK性格。我发现最接近的是韩文填充(U+3164),但我不喜欢它。它太宽了,我预计它会让韩语读起来不舒服(但我很少尝试读韩语,所以我可能错了):

With SPACE: [font =宋体][font =宋体]

带填充物:"我爱你">

也有HALFWIDTH韩文填充(U+FFA0),这是更好的,但UILabel似乎使它零宽度(这可能是一个字体问题,所以也许值得一试):

With SPACE: [font =宋体][font =宋体]

With HALF:

let string = "안녕 하세요"
let filler = "u{3164}"
label.text = string.replacingOccurrences(of: " ", with: filler)

OTOH,如果您使用任何其他非cjk字符,如拉丁标点或阿拉伯数字,您可能会遇到同样的问题。所以这个解决方案可能无法扩展。您应该确保Voice Over正确地忽略它。

最新更新