【发布时间】:2018-01-29 05:54:52
【问题描述】:
基本上,我有一个自定义 UILabel 子类,它根据变量设置标签颜色。
class MyLabel: UILabel {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
textColor = GlobalVars.mainTextColor
}
}
在我的视图控制器上,我有一个设置白色背景并将文本颜色变量设置为黑色的按钮:
@IBAction func btnWhite(_ sender: UIButton) {
GlobalVars.mainTextColor = UIColor.black
GlobalVars.bgColor = UIColor.white
self.view.backgroundColor = UIColor.white
self.view.setNeedsDisplay()
self.view.layoutIfNeeded()
DispatchQueue.main.async { [weak self] in
self?.view.setNeedsLayout()
self?.view.layoutIfNeeded()
}
}
单击此按钮并更新变量后,我希望 ViewController 重新绘制标签,这将更新它们的文本颜色。如果我弹出 VC 并返回,这可以正常工作,但我希望在单击按钮时更新显示。我在视图上有一堆标签,它们都设置为 myLabel 类。我不想手动更改屏幕上的每个标签,我只想重新绘制它。 UIView 不是自定义类,只是 View Controller 附带的默认 UIView。这应该已经在主线程上发生了,但我尝试添加 dispatch.main.async 以防万一。我希望它最终不需要两者。 Image of my view controller layout here
当我单击按钮时,背景变为白色,但标签文本颜色没有更新,我相信这是因为它没有重绘它们。还有第二个按钮 btnBlack,可将其切换为完全相反的亮/暗模式效果。
想法?
【问题讨论】:
-
我看不到您在
btnWhite(:)方法中设置标签文本颜色??并设置您没有调用setNeedsDisplay()或layoutIfNeeded()的视图背景颜色或文本颜色。 -
标签文本颜色在创建标签时通过类 init 设置。这使我可以在一个地方“GlobalVars.mainTextColor”更改颜色,并且使用该类加载的每个标签都会获得该颜色文本。我知道我可以为所有标签手动编码 eachLabel.textColor = GlobalVars.mainTextColor,但有两个原因这不起作用。 1. 有很多标签,我不想每一个都编码。 2. 作为这个 VC 的父级的根 VC 也需要重新加载它的所有标签。这么多编码。我宁愿强制重绘并让类 init 完成工作。
标签: swift uilabel redraw setneedsdisplay