2015-12-02 2 views
5

Я нашел, как установить расстояние между буквами до UILabel (here), но этот метод не работает для UIButtons. Кто-нибудь знает как это делать?Как изменить расстояние между буквами UIButton в Swift?

Вот код, я использую

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 как в вопросе вы связаны
  2. вызов setAttributedTitle(_ ,forState:) на вашем UIButton

Попробуйте это (непроверенные):

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, чтобы иметь параметр интервала, доступный даже в раскадровке. Здесь приходит обновленный Swift 3 Решение:

Swift 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

Swift 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) 
Смежные вопросы