UIButton 文本显示不全 (iOS 13, 14)

2021-01-13  本文已影响0人  广锅锅

今天在 XS Max 14.0 手机上测试时,发现了一个带着图文的删除按钮,文字显示成了 ... ,我发现它宽度很小,于是加了个约束 width.greaterThanOrEqualTo(@44),显示就正常了。

抱着严谨的态度,我把文本设置得更长一点,结果显示成了 xxx...xxx,哦原来这个问题根本没解决掉,前面只显示成 ... 是因为文字太少了。

所以其实 UIButton 自适应尺寸是有效的,只不过它计算的宽度似乎有问题,我估算了下未显示的字符,放在 ... 的位置,好像是刚刚差不多的。

于是我以为系统计算的宽度少了几个像素,后来证明这个猜想是错的。我把文本粗体换成细体,还是不行。(呃,后来上网查了后,又发现这个猜想是对的...... 系统计算出的文本宽度少了 1 pt

实在没办法,上网查了下,找到了答案。发现这个问题是在 iOS 13、14 上,按钮上图片和文字同时显示时,才会出现的。解决的办法有两种

  1. button.titleEdgeInsets = UIEdgeInsetsMake(0, 0, 0, -1)
  2. 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 ,随便选......

上一篇下一篇

猜你喜欢

热点阅读