我找到了一个非常好的但不完全全面的解决方案。
我的大部分视图都是一种或另一种表,所以我做了以下
(注意:我省略了 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)
}
}
}
当然,这里没有涵盖许多内容,包括:
- Navcon 标题
- 标签栏标题
- 章节索引标题
- 警报控制器/操作表
- 显然,任何其他不是 Tables 的 VC。
关于更全面的任何想法/提示,包括我可能会遇到的其他具体观点,但这里没有说明(当然不包括总括 #5)?我已经尝试了 cmets 中提到的解决方案,但都无法使它们中的任何一个都能像这个一样工作。
此外,除了viewDidLayoutSubviews 之外,还有什么想法可以更好地放置这个,因为那个是随机调用的?我试过把它放在viewWillAppear,但由于某种原因这不起作用。