如何在Interface Builder中使用SF字体来设置属性文本

12

我正在使用 Xcode 9.x,想在 InterfaceBuilder 中的 UILabel 上使用富文本。

我想设置:系统字体(San Francisco)和一些粗体样式。但是它不起作用(斜体可以,但粗体不行...)。

除非我在 Xcode 项目中导入所有 San Francisco 字体(但它非常大:15Mb!),否则我无法选择系统字体(San Francisco Pro / Display)

请问如何使其工作?谢谢。


4
在IB中设置属性字符串的用户体验我认为非常糟糕。尝试通过编程方式设置文本,并使用UIFont.systemFont(ofSize:) - Tamás Sengel
我同意。不幸的是,我希望避免这种情况 :'( - QLag
2个回答

17

我能够在界面构建器中(某种程度上)通过直接编辑XML的方式轻松完成。设置所需的带属性字符串,然后查找<font />并按照您的意愿进行编辑。例如,我的按钮使用系统粗体字体。现在,在IB中显示该字体,既适用于属性,也适用于属性字符串的可视化呈现。我可以更改大小,同时保持粗体字。

<font key="NSFont" size="16" name=".AppleSystemUIFontBold"/>

这是上下文:

<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="wordWrap" hasAttributedTitle="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1mt-rM-2b8">
    <rect key="frame" x="211" y="8" width="187" height="52"/>
    <color key="backgroundColor" red="0.0" green="0.41960784309999999" blue="0.72156862749999995" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
    <inset key="contentEdgeInsets" minX="4" minY="16" maxX="4" maxY="16"/>
    <state key="normal">
        <attributedString key="attributedTitle">
            <fragment content="Okay, I'll fill it out now">
                <attributes>
                    <color key="NSColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                    <font key="NSFont" size="16" name=".AppleSystemUIFontBold"/>
                </attributes>
            </fragment>
        </attributedString>
    </state>
    <connections>
        ...
    </connections>
</button>

4
实际上是 <font key="NSFont" metaFont="systemBold"/>,还有 systemsystemMedium等等。至少在 Xcode 11.4 中我是这样看到的。 - mojuba

6
据我所知,您无法严格地在Interface Builder内完成此操作。但是,如果您正在对封装视图或标签视图本身进行子类化,则可以轻松地在awakeFromNib()中重置字体,同时仍保留Interface Builder为标签设置的其余内容。这将节省您完全通过编程方式创建它的时间。
像往常一样在IB中设置标签,包括属性、约束和操作。使用任意字体进行预览。确保Ctrl-drag为样式化标签创建一个outlet,然后使用以下代码在awakeFromNib中切换字体。当您的应用程序运行时,它将使用系统字体以及您已经在IB中建立的所有属性、位置约束等。
例如:
[编辑:更正加粗字体重量,不会从IB传递]
class EnclosingViewSubclass : UIView {

    // The outlet you create for the label
    @IBOutlet weak var styledLabel: UILabel!

    // ...

    override func awakeFromNib() {
        super.awakeFromNib()

        // setting the label's font face to the system font, including picking
        // up the font-size you establish in InterfaceBuilder
        styledLabel.font = UIFont.systemFont(ofSize: styledLabel.font.pointSize, 
                                             weight: UIFontWeightBold)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接