2016-07-13 3 views
0

Я хочу изменить название кнопки по нажатию кнопки:UIButton не меняет название

func dispatchStatusButton(title title:String, backgroundColor:UIColor) { 
    self.btnDispatchStatus.setTitleWithoutAnimation(title.uppercaseString) 
    self.btnDispatchStatus.backgroundColor = backgroundColor 
    self.btnDispatchStatus.kern(2.0) 
} 

Когда я вызываю функцию:

// Set Button 
self.dispatchStatusButton(title: "Inaktiv", backgroundColor: UIColor(red: 40.0/255.0, green: 51.0/255.0, blue: 57.0/255.0, alpha: 1.0)) 

Ничего не происходит, и я некоторое чувство моей функции кернинга причина, но я не понимаю, почему:

extension UIButton { 
    func setTitleWithoutAnimation(title:String?) { 
     UIView.setAnimationsEnabled(false) 
     setTitle(title, forState: .Normal) 
     layoutIfNeeded() 
     UIView.setAnimationsEnabled(true) 
    } 

    func kern(kerningValue:CGFloat) { 
     let attributedText = NSAttributedString(string: self.titleLabel!.text!, attributes: [NSKernAttributeName:kerningValue, NSFontAttributeName:self.titleLabel!.font, NSForegroundColorAttributeName:self.titleLabel!.textColor]) 
     self.setAttributedTitle(attributedText, forState: UIControlState.Normal) 
    } 
} 
+0

Мой подход с такими проблемами заключается в том, чтобы упростить код настолько, насколько это возможно, и постепенно вводить строки кода. Вы пробовали без вызовов 'UIView.setAnimationsEnabled'? –

+0

Теперь я понял, что проблема с функцией kern. как только я отключу его снова, он работает. Но почему это не освежает текст при его использовании? – sesc360

+0

Посмотрите на мой ответ, я проверил его. –

ответ

2

проблема в том, что self.titleLabel.text свойство получает обновлен в следующем макете. Вот почему вы установили заголовок через функцию setTitle(:forState:), а не непосредственно на ярлык. В вашей функции kern вы ссылаетесь на нее, когда она еще не обновляется. Попробуйте следующее:

func kern(kerningValue:CGFloat) { 
    let title = self.titleForState(.Normal) ?? "" // This gets the new value 
    let attributedText = NSAttributedString(string: title, attributes: [NSKernAttributeName:kerningValue, NSFontAttributeName:self.titleLabel!.font, NSForegroundColorAttributeName:self.titleLabel!.textColor]) 
    self.setAttributedTitle(attributedText, forState: UIControlState.Normal) 
} 
+0

awesome .. спасибо! – sesc360

Смежные вопросы