使用adjustsFontSizeToFitWidth时UILabel文本底部被截断问题咨询
兄弟,我太懂这种糟心的情况了——设置了自动缩字体适配宽度,结果文本下半截没显示全,尤其是带g、y这种有下行部分的字符时特别明显。结合你给出的Label配置,咱们来一步步解决:
先唠唠为啥会出现这个问题
你的Label是顶部、左侧、右侧固定约束,没有高度或底部约束,系统默认会用原始字体(36pt半粗体)的lineHeight来计算Label高度。但当adjustsFontSizeToFitWidth触发字体缩小后,Label的高度并不会自动跟着调整;再加上baselineAdjustment = .alignCenters这个设置,会让缩小后的文本在Label的原始高度里垂直居中,这下带下行部分的字符自然就被底部截断了。
靠谱的解决办法来啦
调整baselineAdjustment属性
把baselineAdjustment改成.alignBaselines或者.none试试。.alignCenters是罪魁祸首之一——它会强制缩放后的文本在原始高度里居中,导致下行部分超出Label边界;换成.alignBaselines会保持文本基线对齐,给下行字符留足空间;.none则会让文本按原始基线位置布局,也能避免截断。
代码示例:label.baselineAdjustment = .alignBaselines让Label高度跟着缩放后的字体走
既然你的Label没有高度约束,系统只会认原始字体的高度。你可以在设置完文本后,让Label自动调整高度:// 非自动布局环境直接调用 label.sizeToFit() // 自动布局环境下,绑定高度到intrinsicContentSize label.heightAnchor.constraint(equalToConstant: label.intrinsicContentSize.height).isActive = true这样Label的高度就会根据实际显示的字体大小自适应,不会再用原始高度卡着了。
开启字间距适配辅助
有时候没必要把字体缩得太小,开启adjustsLetterSpacingToFitWidth,让Label通过微调字间距来适配宽度,减少字体缩小的幅度,也能间接避免截断问题:label.adjustsLetterSpacingToFitWidth = true给底部加一点点内边距
如果上面的方法还不够,手动给Label加个底部内边距,给下行字符留缓冲空间:label.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 2, right: 0)这个数值可以根据实际显示效果微调,比如2pt或3pt就行,不用太大。
你可以先试试调整baselineAdjustment,这个是最直接的;如果不行再结合动态调整高度或者内边距,应该就能搞定底部截断的问题了。
内容的提问来源于stack exchange,提问作者Kqtr

