UIButton 文本显示不全 (iOS 13, 14)
2021-01-13 本文已影响0人
广锅锅
今天在 XS Max 14.0 手机上测试时,发现了一个带着图文的删除按钮,文字显示成了 ...
,我发现它宽度很小,于是加了个约束 width.greaterThanOrEqualTo(@44)
,显示就正常了。
抱着严谨的态度,我把文本设置得更长一点,结果显示成了 xxx...xxx
,哦原来这个问题根本没解决掉,前面只显示成 ...
是因为文字太少了。
所以其实 UIButton 自适应尺寸是有效的,只不过它计算的宽度似乎有问题,我估算了下未显示的字符,放在 ...
的位置,好像是刚刚差不多的。
于是我以为系统计算的宽度少了几个像素,后来证明这个猜想是错的。我把文本粗体换成细体,还是不行。(呃,后来上网查了后,又发现这个猜想是对的...... 系统计算出的文本宽度少了 1 pt
)
实在没办法,上网查了下,找到了答案。发现这个问题是在 iOS 13、14 上,按钮上图片和文字同时显示时,才会出现的。解决的办法有两种
button.titleEdgeInsets = UIEdgeInsetsMake(0, 0, 0, -1)
button.titleLabel.lineBreakMode = NSLineBreakByClipping;
个人觉得,如果你有继承自 UIButton 的自定义 Button,采用方案1,重写系统的 setter 方法
// 没有测试过,应该是这样写
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.titleEdgeInsets = UIEdgeInsetsZero;
// ...... custom code ......
}
return self;
}
- (void)setTitleEdgeInsets:(UIEdgeInsets)titleEdgeInsets {
titleEdgeInsets.right -= 1.0;
[super setTitleEdgeInsets:titleEdgeInsets];
}
- (UIEdgeInsets)titleEdgeInsets {
UIEdgeInsets temp = [super titleEdgeInsets];
temp.right += 1.0;
return temp;
}
如果是直接使用 UIButton ,随便选......