Swift UILabel&x27;在视图重新出现之前,字体不会调整

Swift UILabel&x27;在视图重新出现之前,字体不会调整,swift,xcode,uitableview,uifont,Swift,Xcode,Uitableview,Uifont,使用故事板,我创建了一个带有标签的单元格的表视图 我希望能够轻松地为我的应用程序中的所有标签分配相同的字体,因此我在助手文件(smallFont、mediumFont和largeFont)和tableView(tableView:UITableView、cellForRowAtIndexPath:nsindepath)中创建了一些字体。我将每个标签设置为使用我想要的字体(即cell.label.font=Common.fonts.mediumFont) tableview第一次显示时,它使用的是

使用故事板,我创建了一个带有标签的单元格的表视图

我希望能够轻松地为我的应用程序中的所有标签分配相同的字体,因此我在助手文件(smallFont、mediumFont和largeFont)和
tableView(tableView:UITableView、cellForRowAtIndexPath:nsindepath)中创建了一些字体。
我将每个标签设置为使用我想要的字体(即cell.label.font=Common.fonts.mediumFont)

tableview第一次显示时,它使用的是故事板中定义的字体,在您离开视图并返回之前,它不会使用我编程使用的字体

我可以通过更改情节提要以使用我以编程方式放置的相同字体来消除视觉尺寸调整,但我希望能够通过调整公共文件中的字体来更改整个应用程序中的字体

当视图第一次出现时,如何覆盖故事板的字体并强制其使用编程输入字体

编辑:添加更多信息


当我滚动表格时,标签字体从故事板大小更改为编程字体。

您是否尝试过从cell类的awakeFromNib修改字体

以下是一个示例:

class CustomFontCell: UITableViewCell {
    @IBOutlet var titleLabel: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        titleLabel.font = Common().appleBerryFont(size: 28.0)
    }    
}

struct Common {

    func appleBerryFont(size: CGFloat) -> UIFont {
        return UIFont(name: "appleberry", size: size)!
    }

}


通常,awakeFromNib用于执行其他初始化。

首先,通过创建字体替换常用方法。我想不出有哪种情况是这样的

label.font = UIFont.systemFontOfSize(20)
假设这是可行的,使用断点调试原始代码。您需要确保在第一次执行testFont行时使用有效的NOTNIL值

let testFont = Common.fonts.mediumFont
label.font = testFont

嗯,您可以尝试prepareForReuse(),此函数用于执行一些最终修改或重置:

override func prepareForReuse() {
    super.prepareForReuse()
    titleLabel.font = Common().appleBerryFont(size: 28.0)
}

另一种技术-子类UILabel并在那里设置字体。在需要的地方,在故事板中使用该标签。例如:

import UIKit
class StandardLabel: UILabel {

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

    func commonInit(){
        self.font = Common.fonts.mediumFont
    }
}

然后在故事板中,将label类更改为StandardLabel。

我通过在
CellForRowatineXpath
willDisplayCell
方法中设置字体来修复它

willDisplayCell
的实现方式如下:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, 
               forRowAt indexPath: IndexPath) {
    // e.g.
    let myCell = cell as! MyCustomCell
    myCell.label.font = UIFont.boldSystemFont(ofSize: 17.0)
}

注意:字体是在
willDisplayCell
方法中的
单元格
输入参数上设置的,如上面的代码所示。如果使用
tableView.dequeueReusableCell(…)
tableView
获取单元格,则该单元格将不起作用。

在自定义标签中,您应该覆盖该单元格

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
}

并在那里更改字体

听起来您的委托/数据源方法设置正确,如果您正在更改
cellforrowatinexpath
中的字体,我唯一能想到的就是调用
tableView.reloadData()
。我不喜欢这个解决方案,所以也许其他人会知道更好的方法。感谢您的建议,我尝试在“viewDidLoad”中使用tableView.reloadData(),并在其上设置断点以验证是否调用了它,但在您导航到另一个屏幕并返回之前,它仍然使用故事板字体。@AgRizzo标签字体在
tableView中设置(tableView:UITableView,cellForRowAtIndexPath indexPath:NSIndexPath)
这是创建单元格的地方。我也遇到了同样的问题。字体是在
CellForRowatineXpath
中设置的。我已经通过在那里添加断点验证了字体的设置。为了确保调用该方法,我还用相同的方法更改了UILabel的背景色。但是,虽然背景色已更改,字体与在故事板中设置的字体保持不变。只有在显示并关闭子ViewController并且再次刷新所有单元格时,才使用正确的字体。@CSjunkie我终于能够修复它了。下面是如何解决的:感谢您的建议,但我已经尝试过了,但它没有工作:(有同样的问题。即使我在
awakeFromNib()
tableView(\utableview:UITableView,cellForRowAt indexath:indexPath)中将字体更改为例如
UIFont.systemFont(of大小:10)
字体已更改为故事板中设置的字体。只有在显示并关闭子ViewController后,或者在将表格单元格滚动到屏幕外并刷新时,才会使用正确的字体。我可以想象,当前项目中不包括Applebery字体,您是否检查过?即使使用建议的系统字体t字体直到第二次显示视图时才更新displayed@CSjunkie您正在使用什么类型的导航来实现此功能?请发布您的代码好吗?您是否100%确定第一次执行此设置字体行?我使用的是选项卡栏导航器,在选项卡之间切换会导致此功能正常工作。相同的代码块正在设置标签文本,这很好,因此代码肯定正在执行。代码很长,但我甚至可以在返回之前将字体更改作为函数的最后一行,但仍然没有更改。@CSjunkie在这种情况下,您必须向我们显示您的所有代码。对于导航栏中的tableview,
cellForRow
在选项卡之间切换时不应调用。因此,在切换时必须触发某些内容,以更新字体。如果您的代码太长而无法发布到此处,请使用此网站。我使用了断点,发现有一个调用
reloadData()
当它从调用
cellForRow
的选项卡栏转换时。我不太愿意发布代码,因为它不是我的,我没有权限发布。谢谢你的建议,但是这并没有解决问题。此外,苹果的文档声明不要将此功能用于任何与内容相关的内容:是的,这是调试的最后手段,如果这也不起作用,请确保代码的某些部分没有正确实现。这可能会起作用,但会增加更多问题。我需要为我要使用的每个字体大小使用不同的子类