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 opacity
为0 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