CTLineGetBoundsWithOptions()
使用CTLineBoundsOptions
。其中一个选择是kCTLineBoundsUseOpticalBounds
,其文档说:
通过此选项以使用光学边界。
但我不明白optical bounds
的含义。
字体设计者可以将字形的光学边界与其印刷边界分开指定。在TrueType字体中,the opbd
table(如果存在)包含光学边界。
来自WWDC 2012 Session 226: Core Text and Fonts:
现在,当我进入下几张幻灯片时,我想特别提醒你注意屏幕上这个矩形的左侧和右侧,因为我将开始向这个API传递一些不同的选项,它将会有一个对任何一方的影响。
当我调用光学边界时,让我们继续前进。这是一个非常小的区别,但你可能已经注意到盒子的边缘在这里被拉了一点。这里发生的是光学界限与印刷界限,线的常规测量密切相关。
但是,在这种情况下,字体设计师已经指定我们的眼睛可能会感觉到字体的方式意味着它们不仅仅与字形测量完全对齐。在这种情况下,光学界限被设计为在这里引入这些卷曲引号中的任何一个,因为我们的眼睛看到圆形的形状。它与我们看到直线的方式有点不同,因此字体设计师通过向我们提供字体信息来补偿这一点。
(查找完整的会话记录here。)
Microsoft describes it this way:
在水平设置中将字形按其明显的左或右范围对齐,或在垂直设置中对齐明显的顶部或底部范围,替换对齐字形按其原点对齐的默认行为。这种行为的另一个名称是视觉证明。给定字形的光学边缘仅与其前进宽度或边界框间接相关;此功能提供了获得真正视觉对齐的方法。