最近在做一个类似微软翻译APP的图片翻译的功能(图片识别,对识别结果进行翻译,翻译结果展示在图片对应原文位置)。下面是微软图片识别的界面
其中文字的空间自适应用到了UILabel的adjustsFontSizeToFitWidth属性、基线调整baselineAdjustment属性。
UILabel *line = [[UILabel alloc] initWithFrame:rect];
line.textColor = [UIColor whiteColor];
line.adjustsFontSizeToFitWidth = YES;
line.baselineAdjustment = UIBaselineAdjustmentAlignCenters;
[self.contentView addSubview:line];
可是结果确是这样的,看似adjustsFontSizeToFitWidth属性并没起到作用。
经过我的调研发现,adjustsFontSizeToFitWidth调整字体是有条件的,当文字宽大于文本控件的宽时,它可以调整并适应控件的宽;而当文字的宽小于文本控件的宽时,它不做调整。所以,如果要文字填充满文本控件的宽的话,需要给UILabel设置一个比较大的字号,使文字的宽大于文本控件的宽。
UILabel *line = [[UILabel alloc] initWithFrame:rect];
line.textColor = [UIColor whiteColor];
//设置一个比较大的字号,使文字的宽大于文本控件的宽,文字才能填充满文本控件的宽
line.font = [UIFont systemFontOfSize:200];
line.adjustsFontSizeToFitWidth = YES;
line.baselineAdjustment = UIBaselineAdjustmentAlignCenters;
[self.contentView addSubview:line];
后记:
中文识别转英文,这样做没有问题。但是如果英文识别转中文,就会出现问题。
由于中文的一句话,普遍比英文短,自适应宽度,高度就会被拉大,导致上下两行文字遮挡的问题。
解决办法:根据区域高度,计算一个不超过区域高度的字号大小,同时设置宽度自适应。
UILabel *line = [[UILabel alloc] initWithFrame:rect];
line.textColor = [UIColor whiteColor];
//保证字号不超过控件区域的高度
CGFloat fontNumber = rect.size.height * 0.6;
line.font = [UIFont systemFontOfSize:fontNumber];
//如果超过控件区域的宽度,自适应
line.adjustsFontSizeToFitWidth = YES;
line.baselineAdjustment = UIBaselineAdjustmentAlignCenters;
如果文字不超过区域宽度,则根据设置字号“适应”高度显示;如果文字超过区域宽度,自适应宽度显示。