You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift4中UIView子类UIBingoBall的setNumber方法异常排查

问题根源:字体大小计算逻辑完全搞反了!

你遇到的情况其实是文本已经正确更新,但字体小到肉眼看不见,所以看起来像是标签没展示。

看你setNumber方法里的字体计算代码:

let fontModifier = frame.height / 70
self.myNumberLabel.font = UIFont.systemFont(ofSize: fontModifier / 24, weight: .heavy)
self.myLetterLabel.font = UIFont.systemFont(ofSize: fontModifier / 8, weight: .heavy)

举个例子:如果你的宾果球视图高度是70pt,那fontModifier就是1,此时数字标签的字体大小是1/24≈0.04pt——这比一根头发丝还细,根本看不到!而你单独设置属性时用的是默认的24pt和8pt字体,所以能正常显示。

快速修复方案

把字体大小的计算从除法改成乘法,这样才能根据视图高度等比例缩放字体:

func setNumber(ballNumber: Int) {
    if ballNumber > 75 || ballNumber < 1 { return }
    let fontModifier = frame.height / 70
    let ballLetter = (ballNumber - 1) / 15
    
    self.myLetterLabel.text = bingoLetterArray[ballLetter]
    self.myNumberLabel.text = "\(ballNumber)"
    self.myimage.image = bingoBallImageArray[ballLetter]
    
    // 这里改成乘法,和默认字体比例保持一致
    self.myNumberLabel.font = UIFont.systemFont(ofSize: 24 * fontModifier, weight: .heavy)
    self.myLetterLabel.font = UIFont.systemFont(ofSize: 8 * fontModifier, weight: .heavy)
}
优化建议:避免依赖frame做布局计算

直接用frame可能会有问题,因为视图布局完成前frame的值可能不准确。更好的做法是把字体缩放逻辑移到layoutSubviews中,这样视图尺寸变化时字体能自动适配:

class UIBingoBall: UIView {
    // ... 你的属性定义 ...
    
    override func layoutSubviews() {
        super.layoutSubviews()
        let fontModifier = bounds.height / 70
        myNumberLabel.font = UIFont.systemFont(ofSize: 24 * fontModifier, weight: .heavy)
        myLetterLabel.font = UIFont.systemFont(ofSize: 8 * fontModifier, weight: .heavy)
    }
    
    func setNumber(ballNumber: Int) {
        if ballNumber > 75 || ballNumber < 1 { return }
        let ballLetter = (ballNumber - 1) / 15
        
        self.myLetterLabel.text = bingoLetterArray[ballLetter]
        self.myNumberLabel.text = "\(ballNumber)"
        self.myimage.image = bingoBallImageArray[ballLetter]
    }
    
    // ... setupViews方法 ...
}
排查小技巧

以后遇到类似“文本已赋值但不显示”的问题,可以临时给标签加个背景色(比如myLetterLabel.backgroundColor = .yellow),这样就能快速判断是文本没赋值,还是字体、位置等显示问题。

内容的提问来源于stack exchange,提问作者Jim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:48:40