因为项目开发中经常碰到界面设计的UILabel
多语言适配问题,所以在这里记录下自己处理这些问题中的一些心得。假如你的工程中需要用到UILabel
显示一个简单的文本“你好”,并支持日文显示,日文你好“こんにちは”,一般UI设计师会给你UILabel的尺寸,例如40pt。于是你开始写代码:
UILabel *chineseLabel = [[UILabel alloc] init];
chineseLabel.text = @"你好";
chineseLabel.textAlignment = NSTextAlignmentCenter;
chineseLabel.backgroundColor = [UIColor redColor];
chineseLabel.textColor = [UIColor whiteColor];
[self.view addSubview:chineseLabel];
[chineseLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.view);
make.centerY.equalTo(self.view).offset(-40);
make.width.mas_equalTo(40);
}];
最后显示出来的结果很好:
![](https://img.haomeiwen.com/i1507332/686373626513c911.png)
但是当切换到日文的时候,显示的结果却会变成这样子:
![](https://img.haomeiwen.com/i1507332/65b55637d3a85fbf.png)
日文的"你好"没有显示完全,很明显这是因为你的宽度设置了40pt,也许有人会觉得可以修改宽度到60pt就可以了。没错,这是最简单粗暴的方法。但是你必须考虑到一个项目支持的往往不止日文,可能还会包括英文,泰文,韩文等等。所以对每一个语言进行判断,然后适配宽度,就会显得比较低效,也不易后期的维护。
解决UILabel的多语言适配问题,我觉得可以根据label的宽度和字体是否可变分为三种情况进行处理:
- label的宽度可变:
label的宽度可变的话,我们可以利用UILabel
的sizeToFit
方法,让label根据文本大小自适应宽度。我们并不需要在代码中强制去设置label的宽度,代码如下所示:
显示结果如下所示:UILabel *jpLabel = [[UILabel alloc] init]; jpLabel.text = @"こんにちは"; jpLabel.textAlignment = NSTextAlignmentCenter; jpLabel.backgroundColor = [UIColor redColor]; jpLabel.textColor = [UIColor whiteColor]; [jpLabel sizeToFit]; [self.view addSubview:jpLabel]; [jpLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.center.equalTo(self.view); // make.width.mas_equalTo(40); }];
![](https://img.haomeiwen.com/i1507332/dd832808db6af14f.png)
-
label的宽度不可变:
有时候设计的UI比较复杂,如果某一个label的宽度变了,会影响到其他界面的显示,那么我们就不能随意的根据文本的长度修改label的宽度。这时候我们可以考虑使用UILabel
的adjustsFontSizeToFitWidth
属性。这个属性的作用是如果文本的长度超出了label的宽度,则缩小文本的字体大小来让文本完全显示。代码如下:UILabel *chineseLabel = [[UILabel alloc] init]; chineseLabel.adjustsFontSizeToFitWidth = YES; chineseLabel.text = @"你好"; chineseLabel.textAlignment = NSTextAlignmentCenter; chineseLabel.backgroundColor = [UIColor redColor]; chineseLabel.textColor = [UIColor whiteColor]; [chineseLabel sizeToFit]; [self.view addSubview:chineseLabel]; [chineseLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(self.view); make.centerY.equalTo(self.view).offset(-40); make.width.mas_equalTo(40); }]; UILabel *jpLabel = [[UILabel alloc] init]; jpLabel.adjustsFontSizeToFitWidth = YES; jpLabel.text = @"こんにちは"; jpLabel.textAlignment = NSTextAlignmentCenter; jpLabel.backgroundColor = [UIColor redColor]; jpLabel.textColor = [UIColor whiteColor]; [self.view addSubview:jpLabel]; [jpLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.center.equalTo(self.view); make.width.mas_equalTo(40); }];
显示结果如下所示:
image.png
-
label的字体和宽度都不可变
当遇到这种情况的时候,我觉得已经不是代码层面可以搞定的时候,这时候可以寻求产品大大和翻译大大的帮助,看下是否可以缩短文案的长度~~
特别说明一点
-
adjustsFontSizeToFitWidth
只是根据你设置的初始字体大小去缩小字体,即当你设置的初始font大小为14的时候,设置adjustsFontSizeToFitWidth
为YES,字体大小都只会小于等于14. -
UILabel
还有一个属性minimumScaleFactor
,可以通过这个属性设置字体可缩小的最小比例。一般可以配合adjustsFontSizeToFitWidth
一起使用。
网友评论