NSObject.BroadSystemFontWeights 警告消息是什么意思?

What does NSObject.BroadSystemFontWeights warning message mean?

我最近将 XCode 更新到 7.0 并收到此警告消息:

 Xcode.IDEInterfaceBuilder.Cocoa.NSObject.BroadSystemFontWeights

这是什么意思,我该如何摆脱它?

当我将字体粗细设置为 Semibold 到带有系统字体的标签时,我遇到了同样的错误。这个权重适用于新系统字体 (San Francisco) 但不适用于旧的 Helvetica Neue,所以我猜这个错误意味着我们不会在旧的 OS.

上获得正确的权重

将字体更改为也适用于 Helvetica Neue 的粗细,Bold 在我的情况下,已为我修复了错误。

问题不在于更改系统字体粗细,问题在于 Xcode 未正确处理此问题 - 我知道,这与声明相矛盾,请参阅 full blog post 了解详细信息。一共有三种情况。

首先——明确的排版并不重要,正常的重量是可以接受的。然后坚持 Marco 的回答并使用明确的常规权重。


其次——明确的排版更可取,但在旧系统上可能会受到影响。这是现在的默认行为,Xcode 只是显示警告并在 10.11 之前的目标上使用常规字体。如果你使用自适应布局,一切都应该没问题。要消除警告,您可以简单地在故事板检查器中设置更高的目标:

请注意,如果您的故事板对较早的目标使用回退功能,它们可能会被禁用,这会导致问题 – 到目前为止我还没有遇到过。


第三——明确的排版是必须的。在这种情况下,您可以将自定义文本字段与自定义可检查项 属性 结合使用。打开身份检查器并将自定义 class 设置为 TextField,首选字体粗细属性将显示在属性检查器中,设置所需的值,构建并享受结果。

import AppKit

@IBDesignable public class TextField: NSTextField
{
    @IBInspectable public var preferredFontWeight: Int = 0

    override public func awakeFromNib() {
        if #available(OSX 10.11, *) {
            return
        }

        guard
        let weight: Int = self.preferredFontWeight where weight > 0,
        let font: NSFont = self.font,
        let name: String = font.familyName,
        let manager: NSFontManager = NSFontManager.sharedFontManager() else {
            return
        }

        // Full details here – https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSFontManager_Class/#//apple_ref/occ/instm/NSFontManager/convertWeight:ofFont:   
        //
        // 1 – ultralight
        // 2 – thin
        // 3 – light, extralight
        // 4 – book
        // 5 – regular, display
        // 6 – medium
        // 7 – demi, demibold
        // 8 – semi, semibold
        // 9 – bold
        // 10 – extra, extrabold
        // 11 – heavy
        // 12 – black
        // 13 – ultrablack
        // 14 – extrablack

        if let font: NSFont = manager.fontWithFamily(name, traits: manager.traitsOfFont(font), weight: weight, size: font.pointSize) {
            self.font = font
        }
    }
}

P.S。粗体字之所以有效,可能是因为它使用了稍微不同的逻辑——boldSystemFontOfSize(_:) 自 OS X 10.0 起可用,这与情节提要可能依赖的许多其他方法不同。