Swift - 如何在设置后更改 UIButton 的 NSMutableAttributedString 的颜色
Swift -How to change the color of a UIButton's NSMutableAttributedString after it has been set
我有 2 个 UIButtons
,它们的 titles
和 colors
最初是使用 NSMutableAttributedString
设置的。正文是
我有一个自定义 UISegmentedControl
,当切换段时,我只需要更改按钮的颜色。我现在这样做的方式是,颜色确实发生了变化,但是当发生这种情况时会出现难看的闪烁,因为实际文本会再次设置。我只需要颜色的平滑过渡
var selectedSegmentIndex = 0 {
didSet {
layoutIfNeeded()
UIView.animate(withDuration: 0.1) {
self.setTextForFollowersButton()
self.setTextForFollowingButton()
self.layoutIfNeeded()
}
}
}
如何只改变按钮的 NSMutableAttributedString
颜色?
按钮代码:
var numOfFollowers = 0 {
didSet {
setTextForFollowersButton()
}
}
var numOfFollowing = 0 {
didSet {
setTextForFollowingButton()
}
}
lazy var followersButton: UIButton = {
let button = UIButton.init(type: .system)
// ...
return button
}()
lazy var followingButton: UIButton = {
let button = UIButton.init(type: .system)
//...
return button
}()
func setTextForFollowersButton() {
let button = self.followersButton
let buttonText = "Following\n\(String(numOfFollowing))" as NSString
// other code for 2 lines of text
var color = UIColor.blue
if selectedSegmentIndex == 0 {
color = UIColor.blue
} else {
color = UIColor.gray
}
let attrString1 = NSMutableAttributedString(string: substring1,
attributes: [NSMutableAttributedString.Key.font:
UIFont.boldSystemFont(ofSize: 16),
NSMutableAttributedString.Key.foregroundColor: color])
let attrString2 = NSMutableAttributedString(string: substring2,
attributes: [NSMutableAttributedString.Key.font:
UIFont.boldSystemFont(ofSize: 14),
NSMutableAttributedString.Key.foregroundColor: color])
attrString1.append(attrString2)
button.setAttributedTitle(attrString1, for: [])
}
func setTextForFollowingButton() {
let button = self.followingButton
let buttonText = "Following\n\(String(numOfFollowing))" as NSString
// other code for 2 lines of text
var color = UIColor.blue
if selectedSegmentIndex == 0 {
color = UIColor.gray
} else {
color = UIColor.blue
}
let attrString1 = NSMutableAttributedString(string: substring1,
attributes: [NSMutableAttributedString.Key.font:
UIFont.boldSystemFont(ofSize: 16),
NSMutableAttributedString.Key.foregroundColor: color])
let attrString2 = NSMutableAttributedString(string: substring2,
attributes: [NSMutableAttributedString.Key.font:
UIFont.boldSystemFont(ofSize: 14),
NSMutableAttributedString.Key.foregroundColor: color])
attrString1.append(attrString2)
button.setAttributedTitle(attrString1, for: [])
}
您应该在 DispatchQueue.main.async {}
中插入 UIView.animate
函数以实现平滑过渡。始终建议在主线程上异步制作 UI 的任何类型的动画。
另一种实现平滑过渡的方法是使用 UIView.performWithoutAnimation
:
DispatchQueue.main.async {
self.layoutIfNeeded()
UIView.performWithoutAnimation {
self.setTextForFollowersButton()
self.setTextForFollowingButton()
self.layoutIfNeeded()
}
}
我有 2 个 UIButtons
,它们的 titles
和 colors
最初是使用 NSMutableAttributedString
设置的。正文是
我有一个自定义 UISegmentedControl
,当切换段时,我只需要更改按钮的颜色。我现在这样做的方式是,颜色确实发生了变化,但是当发生这种情况时会出现难看的闪烁,因为实际文本会再次设置。我只需要颜色的平滑过渡
var selectedSegmentIndex = 0 {
didSet {
layoutIfNeeded()
UIView.animate(withDuration: 0.1) {
self.setTextForFollowersButton()
self.setTextForFollowingButton()
self.layoutIfNeeded()
}
}
}
如何只改变按钮的 NSMutableAttributedString
颜色?
按钮代码:
var numOfFollowers = 0 {
didSet {
setTextForFollowersButton()
}
}
var numOfFollowing = 0 {
didSet {
setTextForFollowingButton()
}
}
lazy var followersButton: UIButton = {
let button = UIButton.init(type: .system)
// ...
return button
}()
lazy var followingButton: UIButton = {
let button = UIButton.init(type: .system)
//...
return button
}()
func setTextForFollowersButton() {
let button = self.followersButton
let buttonText = "Following\n\(String(numOfFollowing))" as NSString
// other code for 2 lines of text
var color = UIColor.blue
if selectedSegmentIndex == 0 {
color = UIColor.blue
} else {
color = UIColor.gray
}
let attrString1 = NSMutableAttributedString(string: substring1,
attributes: [NSMutableAttributedString.Key.font:
UIFont.boldSystemFont(ofSize: 16),
NSMutableAttributedString.Key.foregroundColor: color])
let attrString2 = NSMutableAttributedString(string: substring2,
attributes: [NSMutableAttributedString.Key.font:
UIFont.boldSystemFont(ofSize: 14),
NSMutableAttributedString.Key.foregroundColor: color])
attrString1.append(attrString2)
button.setAttributedTitle(attrString1, for: [])
}
func setTextForFollowingButton() {
let button = self.followingButton
let buttonText = "Following\n\(String(numOfFollowing))" as NSString
// other code for 2 lines of text
var color = UIColor.blue
if selectedSegmentIndex == 0 {
color = UIColor.gray
} else {
color = UIColor.blue
}
let attrString1 = NSMutableAttributedString(string: substring1,
attributes: [NSMutableAttributedString.Key.font:
UIFont.boldSystemFont(ofSize: 16),
NSMutableAttributedString.Key.foregroundColor: color])
let attrString2 = NSMutableAttributedString(string: substring2,
attributes: [NSMutableAttributedString.Key.font:
UIFont.boldSystemFont(ofSize: 14),
NSMutableAttributedString.Key.foregroundColor: color])
attrString1.append(attrString2)
button.setAttributedTitle(attrString1, for: [])
}
您应该在 DispatchQueue.main.async {}
中插入 UIView.animate
函数以实现平滑过渡。始终建议在主线程上异步制作 UI 的任何类型的动画。
另一种实现平滑过渡的方法是使用 UIView.performWithoutAnimation
:
DispatchQueue.main.async {
self.layoutIfNeeded()
UIView.performWithoutAnimation {
self.setTextForFollowersButton()
self.setTextForFollowingButton()
self.layoutIfNeeded()
}
}