在 Cocoa 中使用非标准字体时,与标准系统字体相比,它们有时会错位。我创建了一个示例 OS X Cocoa 应用程序来说明该问题:http://www.fileconvoy.com/dfl.php?id=g2bff79a0dcf64cc4999493513da42fd8dbb9294e1 .
看起来像这样:
左侧的标签和按钮是默认系统字体,而右侧的字体更改为Al Bayan(OS X 附带)。
我正在开发一个应用程序,其中的字体必须动态更改。如果用户将字体更改为具有类似行为的字体,我需要一些技术来更改控件内的边距/填充,在本例中如下:
- 按钮:+5px 上边距/内边距
- 标签:-5px 上边距/内边距
如何做到这一点?
最佳答案
对于“Helvetica Neue”来说,情况尤其糟糕,它是一种标准字体(在 iOS 中),并且可能会在未来的 OS X 版本中发挥更大的作用。除了更改字体之外,我不知道调整各个控件的方法,但我找到了一种通过自己的计算正确渲染文本的方法。这里的关键是不使用字符串高度(例如,用于居中或放置字符串),而是考虑上升部分和 xHeight。
以下代码垂直居中绘制 NSTextFieldCell 的标题,无论使用什么字体:
- (NSRect)titleRectForBounds: (NSRect)theRect
{
NSRect titleFrame = [super titleRectForBounds: theRect];
CGRect rect = [self.attributedStringValue boundingRectWithSize: NSMakeSize(FLT_MAX, NSHeight(titleFrame))
options: 0];
titleFrame.origin.y -= NSHeight(rect) - floor(self.font.ascender);
titleFrame.origin.y += floor((titleFrame.size.height - self.font.xHeight) / 2);
return titleFrame;
}
- (void)drawInteriorWithFrame: (NSRect)cellFrame inView: (NSView *)controlView
{
NSRect titleRect = [self titleRectForBounds: cellFrame];
[self.attributedStringValue drawInRect: titleRect];
}
单元格是 NSOutlineView 的一部分,因此会翻转。对于非翻转内容,解决方案可能更简单一些(尚未测试过)。
关于objective-c - Cocoa 中的自定义字体错位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23285679/