objective-c - Cocoa 中的自定义字体错位

标签 objective-c cocoa fonts

在 Cocoa 中使用非标准字体时,与标准系统字体相比,它们有时会错位。我创建了一个示例 OS X Cocoa 应用程序来说明该问题:http://www.fileconvoy.com/dfl.php?id=g2bff79a0dcf64cc4999493513da42fd8dbb9294e1 .

看起来像这样:

Custom font is misplaced inside label and button

左侧的标签和按钮是默认系统字体,而右侧的字体更改为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/

相关文章:

css - wordpress 字体 css 在 firefox 中不起作用

objective-c - 摆脱“由于设置了OBJC_DISABLE_GC而强制关闭GC”

cocoa - 如何更改 Apple SourceView 示例中的行大小

cocoa - 如何在我的 Cocoa 应用程序中正确嵌入第三方框架?

ios - 将 NSDecimal 设置为零

visual-studio-code - 如何更改 VS Code 设置以使用 JetBrains Mono 字体

html - 在 Internet Explorer 的头部注入(inject) Javascript 字体

iOS Swift 方法在 obj C 项目上调用

ios - 如果区域没有主要,则区域监视在 iOS 中不起作用

objective-c - ARC/ObjC++ : ObjC objects as C++ member variable