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

时间:2018-01-21 20:40:46

标签: ios swift fonts

我希望我的应用中的所有文字都以Oswald字体显示。我见过很多涉及UILabel.appearance().font = yourFont等问题的答案。但是,据我所知,这需要使用UIFont(name:_size:_)构造一个字体,当然这需要一个大小参数。这意味着应该是不同大小的不同标签(如字幕样式表格单元格中的标题和副标题文本)都以相同的大小显示。

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

补充问题: 1. UITextView的{​​{1}} / UITextField等价物是多少? UILabel.appearance().font似乎不存在。 2.这些应用程序范围的语句中是否还有一种方法可以影响导航栏标题字体和表格节标题字体等内容?

1 个答案:

答案 0 :(得分:0)

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

我的大部分观点都是这种或那种的表格,所以我做了以下几点 (注意:我省略了FontNames struct,其中包含了获取粗体/粗体/光线变化的功能。另外,非常感谢https://stackoverflow.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)
    }

}

}

当然,有很多事情不包括在内,包括:

  1. Navcon标题
  2. 标签栏标题
  3. 部分索引标题
  4. 警报控制器/操作表
  5. 显然不是表格的任何其他VC。
  6. 关于更全面的任何想法/提示,包括我可能会遇到的其他具体观点,这些都没有在这里解释(当然不算数量#5)?我已经尝试过评论中提到的解决方案,并且不能使它们中的任何一个像这个一样有效。

    此外,除了viewDidLayoutSubviews之外,还有任何关于更好地放置这个的想法,因为那个被随机调用了吗?我已经尝试将其放入viewWillAppear,但由于某种原因这不起作用。