有时需要UILabel的文字左右两边对齐。比如这样:
图1.左右两边对齐.png
图中的“时间”等中间要有一定的间距,以达到冒号对齐的效果。
简单列下UILabel文字对齐的系统样式:
public enum NSTextAlignment : Int {
case left = 0 // Visually left aligned
case center = 1 // Visually centered
case right = 2 // Visually right aligned
case justified = 3 // Fully-justified. The last line in a paragraph is natural-aligned.
case natural = 4 // Indicates the default alignment for script
}
好像都不能满足需求。
大部分场景下我想都可以用手动打空格的方式来处理,虽然笨但很方便、有效。可是有些时候你会遇到一些问题:
a) 你要对齐文字的宽度是动态变化的,没办法手动打空格满足所有的宽度;
b) 你要对齐的文字的宽度虽然是固定的,但文字中夹杂着数字、英文和汉字,你可能怎么打空格宽度都和它对不齐。
图2.手动打空格失败的效果.png
那么就得稍微麻烦点,设置下字间距了。其实也很简单,主要的代码就两行而已,示例代码如下:
// 假设label的宽度为50
let labelW: CGFloat = 50
let text = "时间"
// size函数是对boundingRect方法的简单封装,用来获取text正常显示情况下的size,大家肯定都知道,就不展开了。
let textW = text.size(font: font(15)).width
/**********就这两行主要代码*********/
// *计算字间距*
let kern = (labelW - textW) / CGFloat(text.count - 1)
// *设置字间距*
let ats = [NSAttributedString.Key.kern : kern]
/********************************/
let label = UILabel(frame: CGRect(x: 0, y: 0, width: labelW, height: 20))
label.attributedText = NSAttributedString(string: text, attributes: ats)
当然,可能更实际的需求是只设置某部分文字的字间距,达到部分文字对齐的效果,就像图1中的效果一样,只要设置冒号之前的字间距使冒号对齐就好。那么也很简单,根据自己的需求在设置属性的时候也设置下range就好了。
网友评论