iOS 8 – 在Interface Builder中更改UILabel上的字符间距

有无论如何改变使用Interface Builder的UILabel文本的字符间距(轨道)? 如果没有,是否有办法以编程方式在已经使用属性文本创build的现有UILabel上进行编辑?

我知道这不是一个界面生成器的解决scheme,但你可以创build一个UILabel扩展,然后添加间距到任何你想要的UILabel

 extension UILabel { func addCharacterSpacing() { if let labelText = text, labelText.count > 0 { let attributedString = NSMutableAttributedString(string: labelText) attributedString.addAttribute(NSAttributedStringKey.kern, value: 1.15, range: NSRange(location: 0, length: attributedString.length - 1)) attributedText = attributedString } } } 

然后在设置文本值之后调用它:

 myLabel.text = "We used to be so close" myLabel.addCharacterSpacing() 

考虑将1.15间距值更改为适合您的值以及您在应用中使用的字体。

现在结束使用此现在得到现有的属性文本和修改添加字符间距:

 let attributedString = discoveryTitle.attributedText as NSMutableAttributedString attributedString.addAttribute(NSKernAttributeName, value: 1.0, range: NSMakeRange(0, attributedString.length)) discoveryTitle.attributedText = attributedString 

Swift 3:

 let attributedString = NSMutableAttributedString(string: discoveryTitle.text) attributedString.addAttribute(NSKernAttributeName, value: CGFloat(1.0), range: NSRange(location: 0, length: attributedString.length)) discoveryTitle.attributedText = attributedString 

在Swift 3中使用NSRange而不是NSMakeRange。

对于完全静态的文本,比如视图的标题,或者特别是launchScreen ,你可以插入占用很小的宽度的字母(例如'l'字符), 0 opacity0 opacity 。 或者将其颜色设置为与背景相同。

我意识到这个事实,这不是最漂亮的解决scheme,但它是唯一的解决scheme,无需编写任何代码和工作 – 直到您可以通过在Xcode中指定属性来完成。

结果如何

编辑/其他的想法:为了让你的间距更可变,你可以改变填充字符之间的字体大小。 (感谢@ mohamede1945为这个想法)

尝试这个!!

创buildCustomLabel类

 @interface CustomLabel : UILabel @property (assign, nonatomic) CGFloat myLineSpacing; @end @implementation CustomLabel - (void)setMyLineSpacing:(CGFloat)myLineSpacing { _myLineSpacing = myLineSpacing; self.text = self.text; } - (void)setText:(NSString *)text { NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.lineSpacing = _myLineSpacing; paragraphStyle.alignment = self.textAlignment; NSDictionary *attributes = @{NSParagraphStyleAttributeName: paragraphStyle}; NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:attributes]; self.attributedText = attributedText; } 

并设置运行时间属性

在这里输入图像说明

注意,这实际上是行间距 (也称为前导 ..在过去的日子里(前数字),你把铅(金属)之间的线之间的差距,以增加线之间的差距对于字母间距 ,这就是所谓的字距 。 。这里是如何做核心https://stackoverflow.com/a/21141156/294884

受到budidinho的回答的启发,这是一个更灵活的解决scheme,当你想改变不同行间距标签的间距。 而不是进入function和改变值,你可以把它作为parameter passing。

 extension UILabel { func setTextSpacingBy(value: Double) { if let textString = self.text { let attributedString = NSMutableAttributedString(string: textString) attributedString.addAttribute(NSKernAttributeName, value: value, range: NSRange(location: 0, length: attributedString.length - 1)) attributedText = attributedString } } } 

为什么你们都在定义NSMUTABLEAttributedString。 您不必显式设置范围。 它使emojis有时看起来很奇怪。 这是我的解决scheme,在Swift 4中进行了testing。 👍

 extension UILabel { func addCharactersSpacing(_ value: CGFloat = 1.15) { if let textString = text { let attrs: [NSAttributedStringKey : Any] = [.kern: value] attributedText = NSAttributedString(string: textString, attributes: attrs) } } } 

Swift 3.2和接口生成器

 extension UILabel { @IBInspectable var letterSpace: CGFloat { set { let attributedString: NSMutableAttributedString! if let currentAttrString = attributedText { attributedString = NSMutableAttributedString(attributedString: currentAttrString) } else { attributedString = NSMutableAttributedString(string: text ?? "") text = nil } attributedString.addAttribute(NSKernAttributeName, value: newValue, range: NSRange(location: 0, length: attributedString.length)) attributedText = attributedString } get { if let currentLetterSpace = attributedText?.attribute(NSKernAttributeName, at: 0, effectiveRange: .none) as? CGFloat { return currentLetterSpace } else { return 0 } } } } 

在这里输入图像说明

如果您正在尝试为启动屏幕执行此操作,则只需在其他软件工具中创build文本的图像即可。 无论如何,您无法本地化启动屏幕,因此避免了任何冒险的方法。

编程方法。 (试试这个,它应该适合你)
注意:我在Swift 4中testing过

 let label = UILabel() let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel" let attrString = NSMutableAttributedString(string: stringValue) var style = NSMutableParagraphStyle() style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48 style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40 // Line spacing attribute attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: style, range: NSRange(location: 0, length: stringValue.characters.count)) // Character spacing attribute attrString.addAttribute(NSAttributedStringKey.kern, value: 2, range: NSMakeRange(0, attrString.length)) label.attributedText = attrString