2015-12-02 56 views
5

我发现如何设置字母间距到UILabel(here),但此方法不适用于UIButtons。有谁知道该怎么做?如何在Swift中更改UIButton的字母间距?

这里是我使用

let buttonString = agreementButton.attributedTitleForState(.Normal) as! NSMutableAttributedString 
    buttonString.addAttribute(NSKernAttributeName, value: 1.0, range: NSMakeRange(0, buttonString.length)) 
    agreementButton.setAttributedTitle(buttonString, forState: .Normal) 

这引发了我的错误代码:'NSConcreteAttributedString' (0x19e508660) to 'NSMutableAttributedString' (0x19e506a40).

+0

确切位置在哪里出了问题?请发布不适合你的代码。 –

+0

更新为你看破碎的代码。 –

回答

10
  1. 充分利用NSAttributedString如你问题你对你的UIButton
  2. 链接
  3. 呼叫setAttributedTitle(_ ,forState:)

试试这个(未经测试):

let title = agreementButton.titleForState(.Normal) 
let attributedTitle = NSAttributedString(string: title, attributes: [NSKernAttributeName: 1.0]) 
agreementButton.setAttributedTitle(attributedTitle, forState: .Normal) 
+0

完成。我用代码和错误更新了这个问题。 –

+0

不,错误:类型'UIButton'的值没有成员'setAttributedTitleForState' –

+0

我的不好。应该只是'setAttributedTitle'。编辑 –

2

Code Different该解决方案不尊重文本颜色设置。也可以重写UIButton类,使间隔参数即使在故事板中也可用。这里谈到的更新斯威夫特3溶液:

斯威夫特3

class UIButtonWithSpacing : UIButton 
{ 
    override func setTitle(_ title: String?, for state: UIControlState) 
    { 
     if let title = title, spacing != 0 
     { 
      let color = super.titleColor(for: state) ?? UIColor.black 
      let attributedTitle = NSAttributedString(
       string: title, 
       attributes: [NSKernAttributeName: spacing, 
          NSForegroundColorAttributeName: color]) 
      super.setAttributedTitle(attributedTitle, for: state) 
     } 
     else 
     { 
      super.setTitle(title, for: state) 
     } 
    } 

    fileprivate func updateTitleLabel_() 
    { 
     let states:[UIControlState] = [.normal, .highlighted, .selected, .disabled] 
     for state in states 
     { 
      let currentText = super.title(for: state) 
      self.setTitle(currentText, for: state) 
     } 
    } 

    @IBInspectable var spacing:CGFloat = 0 { 
     didSet { 
      updateTitleLabel_() 
     } 
    } 
} 
6

雨燕3.0

extension UIButton{ 
    func addTextSpacing(spacing: CGFloat){ 
     let attributedString = NSMutableAttributedString(string: (self.titleLabel?.text!)!) 
     attributedString.addAttribute(NSKernAttributeName, value: spacing, range: NSRange(location: 0, length: (self.titleLabel?.text!.characters.count)!)) 
     self.setAttributedTitle(attributedString, for: .normal) 
    } 
} 
btnRegister.addTextSpacing(spacing: 4.5) 

extension UILabel{ 
    func addTextSpacing(spacing: CGFloat){ 
     let attributedString = NSMutableAttributedString(string: self.text!) 
     attributedString.addAttribute(NSKernAttributeName, value: spacing, range: NSRange(location: 0, length: self.text!.characters.count)) 
     self.attributedText = attributedString 
    } 
} 
lblOne.addTextSpacing(spacing: 4.5) 

extension UITextField{ 
    func addPlaceholderSpacing(spacing: CGFloat){ 
     let attributedString = NSMutableAttributedString(string: self.placeholder!) 
     attributedString.addAttribute(NSKernAttributeName, value: spacing, range: NSRange(location: 0, length: self.placeholder!.characters.count)) 
     self.attributedPlaceholder = attributedString 
    } 
} 
txtUserName.addPlaceholderSpacing(spacing: 4.5) 

extension UINavigationItem{ 
    func addSpacing(spacing: CGFloat){ 
     let attributedString = NSMutableAttributedString(string: self.title!) 
     attributedString.addAttribute(NSKernAttributeName, value: spacing, range: NSRange(location: 0, length: self.title!.characters.count)) 
     let label = UILabel() 
     label.textColor = UIColor.black 
     label.font = UIFont.systemFont(ofSize: 15, weight: UIFontWeightBold) 
     label.attributedText = attributedString 
     label.sizeToFit() 
     self.titleView = label 
    } 
} 
navigationItem.addSpacing(spacing: 2.5)