gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:11:38 30 4
gpt4 key购买 nike

在 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com