设置允许不同大小的应用程序范围的默认字体

Posted

技术标签:

【中文标题】设置允许不同大小的应用程序范围的默认字体【英文标题】:Setting app-wide default font that allows for varying sizes 【发布时间】:2018-01-21 20:40:45 【问题描述】:

我希望我的应用程序中的所有文本都以 Oswald 字体显示。我已经看到了涉及 UILabel.appearance().font = yourFont 之类的出色答案。然而,据我所知,这需要使用UIFont(name:_size:_) 构造一个字体,当然,它需要一个大小参数。这意味着应该具有不同大小的不同标签(例如字幕样式表格单元格中的标题和副标题文本)都以相同的大小显示。

是否有一种简单的方法可以为整个应用设置一次字体,并允许不同对象的尺寸为其标准尺寸?

补充问题: 1. 什么是UITextView/UITextField 等价于UILabel.appearance().fontUITextView.appearance().font 似乎不存在。 2. 在这些应用程序范围的语句中是否有办法也影响导航栏标题字体和表格部分标题字体等内容?

【问题讨论】:

Using custom font for entire ios app swift的可能重复 查看***.com/questions/8707082/… 【参考方案1】:

我找到了一个非常好的但不完全全面的解决方案。

我的大部分视图都是一种或另一种表,所以我做了以下 (注意:我省略了 FontNames struct ,其中包含一个获得粗体/斜体/浅色变化的功能。另外,非常感谢 https://***.com/a/44921262/6826164 的子视图功能。

extension UITableViewController 

open override func viewDidLayoutSubviews() 
    super.viewDidLayoutSubviews()
    for view in subviewsOf(view) 
        setFont(for: view)
    


fileprivate func subviewsOf<T: UIView>(_ view: UIView) -> [T] 
    var subviews = [T]()

    for subview in view.subviews 
        subviews += subviewsOf(subview) as [T]

        if let subview = subview as? T 
            subviews.append(subview)
        
    
    return subviews


fileprivate func setFont(for view: UIView) 

    if let label = view as? UILabel 
        label.font = UIFont(name: FontNames.fontName(), size: label.font.pointSize)
    
    else if let textField = view as? UITextField, let font = textField.font 
        textField.font = UIFont(name: FontNames.fontName(light: true), size: font.pointSize)
    
    else if let textView = view as? UITextView, let font = textView.font 
        textView.font = UIFont(name: FontNames.fontName(light: true), size: font.pointSize)
    
        // Technically this button font setting is unnecessary since the titleLabel will be covered as a UILabel in the view heirarchy,
        // but this allows a separate font for buttons if desired
    else if let button = view as? UIButton, let label = button.titleLabel 
        button.titleLabel!.font = UIFont(name: FontNames.fontName(), size: label.font.pointSize)
    




当然,这里没有涵盖许多内容,包括:

    Navcon 标题 标签栏标题 章节索引标题 警报控制器/操作表 显然,任何其他不是 Tables 的 VC。

关于更全面的任何想法/提示,包括我可能会遇到的其他具体观点,但这里没有说明(当然不包括总括 #5)?我已经尝试了 cmets 中提到的解决方案,但都无法使它们中的任何一个都能像这个一样工作。

此外,除了viewDidLayoutSubviews 之外,还有什么想法可以更好地放置这个,因为那个是随机调用的?我试过把它放在viewWillAppear,但由于某种原因这不起作用。

【讨论】:

以上是关于设置允许不同大小的应用程序范围的默认字体的主要内容,如果未能解决你的问题,请参考以下文章

如何在不更改字体本身的情况下更改 uilabel 的字体大小?

TextInput 允许字体缩放 false

浏览器默认改变字体大小解决方案

H5页面中字体大小动态配置

android程序中字体大小的单位是啥?

微软visio设置默认字体大小