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
相关产品推荐
相关产品推荐

