【问题标题】:Vertical bar character appearing oddly within NSString在 NSString 中奇怪地出现竖线字符
【发布时间】:2016-07-03 18:42:57
【问题描述】:

字符串文字中的垂直条 | 字符在渲染时在 Xcode 和 iPad 模拟器上的显示方式不同。

基本上,我只是将一组值用竖线| 字符分隔为NSString 文字。


Objective-C 代码:

NSString cars = @"Ferrari | Maserati | Subaru | Porsche | Mazda | Renault | Aston | Cadillac"

这没什么特别的,但无论出于何种原因,它在 Xcode 和 iPad 模拟器中都以奇怪的形式出现。

问题截图:

绿色箭头显示|字符,看起来不错,但红色箭头指向的同一个字符看起来有点粗且模糊。

仅供参考:

  • 我在 UILabel 中呈现此字符串文字。
  • UILabel 的字体为System- System,样式为Regular,大小为14

我真的为这个问题发疯了很长一段时间,无法弄清楚是什么原因造成的。

【问题讨论】:

  • 唯一想到的就是检查标签的框架是否在小数点上。
  • 这条线的宽度可能只有 1 px(或接近它的某个值)。如果该位置没有产生全像素位置,则将使用子像素(抗锯齿),这就是线条会模糊的原因。您也可以在所有其他角色上看到相同的模糊性。解决方案是使用单独的标签,其中每个分隔符都是一个视图,而不仅仅是字符串的一部分。然后您就可以将分隔符放在整数位置上。
  • 实际上这是一个符合 Unicode 标准的“垂直线”字符。 “按位或”只是它在编程语言中的含义:fileformat.info/info/unicode/char/7c/index.htm
  • @Avi ,标签框是指放置 nslabel 的 uiview 上的尺寸?好吧 x 和 y 轴不包含任何小数值,事实上 xcode IB 不允许小数值。
  • @dreamweiver 这并不昂贵,只是需要更多的时间来实现。例如,您可以使用UICollectionView

标签: ios objective-c ipad nsstring


【解决方案1】:

这纯粹是 CoreText 抗锯齿渲染的结果。 您无法控制它,因为 Mac OS 和 iOS 的文本渲染引擎会忽略 TTF 和 OTF 文件中的提示指令,这些提示旨在使字符“粘”在整数像素上。

这只是一个仅在低分辨率显示器(例如原始 iPad)上显示的非问题;配备 Retina 显示屏的设备具有更清晰的渲染效果,而且问题(如果存在)不会引起注意。

【讨论】:

  • 嗯是有道理的,但解决方案是什么?我也不能使用任何其他字符作为分隔符。
  • 我会并排堆叠 UILabel,用细线 UIView(1px 宽)将它们分开。如果您的目标是 iOS 9,则可能使用 UIStackView。这里没有通用的解决方案,只是一个偏好问题。
  • 是的,我同意这一点,看起来没有简单的解决方案。此外,使用多个 uilabels 和 uiview 作为分隔线确实没有意义,对于这样一个小问题来说太多了。我正在考虑保持原样,直到找到一个简单的解决方案
  • 考虑到这在高密度 Retina 屏幕上甚至可能不是问题。
  • 哦,那是我还没有测试过的东西,我也可以试试那个选项。
【解决方案2】:

正如其他人所指出的,您可能遇到了小数像素,这会导致抗锯齿。即使只是阅读您问题中的文字,我在 Safari 中也看到了类似的问题。也正如其他人所指出的,您似乎在这个字符串中的其他字符被抗锯齿。例如,看看保时捷的P 和雷诺的E。 (也许这些是压缩伪影,但可能在原始版本中。)

尝试改善这种情况的一种常见方法是使用奇怪的字体大小(13 或 15 而不是 14)。这并不总是成功的,但可以提供帮助。绝对解决此问题的唯一方法是进行自己的文本布局,以确保 | 字符对齐而不是使用标签。您可以通过让 Core Text 进行布局,然后调整关键字形的位置来做到这一点。或者您可以手动绘制垂直线而不是使用文本。 (@Sulthan 提出了一个有趣的小集合视图建议,它可能更灵活。)

【讨论】:

  • 我确实尝试将字体大小更改为 15,但没有任何区别。我也不能使用UICollectionView 来解决这样一个简单的问题,感觉对于这样一个简单的问题来说它做得太多了,所以我正在寻找一些更简单的解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 2014-01-13
  • 2013-11-26
  • 1970-01-01
相关资源
最近更新 更多