如何让 iOS 的颜色更改在整个应用程序中生效?
How do I get color changes to take effect over the entire app for iOS?
我有一种测试应用程序,我正在其中试听各种配色方案。该应用程序使用名为 myHighlight
和 mySecondaryColor
的全局颜色变量。我有一系列颜色我想试听。我有一个按钮,按下该按钮会将这些变量更改为我要测试的下一个颜色,但是如何让所有使用它们的视图重新加载并使用新值?调用 setNeedsDisplay()
不起作用,我假设是因为视图已经将它们的背景颜色存储为实例属性并且不再使用全局引用。有没有办法清除内存并让所有视图重新初始化,这样我就可以在不重新启动应用程序的情况下看到颜色变化的结果?
而不是在按下 button/switch 之后访问每个视图,使用 NotificationCenter
怎么样?这是一个可能适合您的解决方案:
- 创建自定义
Notification.Name
让我们称之为 AppThemeChanged
- 从您想要更改颜色的视图订阅此通知
NotificationCenter.default.addObserver(self, selector: #selector(appThemeChanged), name: Notification.Name.AppThemeChanged, object: nil)
- 在
appThemeChanged
函数中重置颜色
- 当按钮被按下时通知视图
NotificationCenter.default.post(name: Notification.Name.AppThemeChanged, object: nil, userInfo: nil)
另外,我建议将选定的主题存储在共享实例或可全局访问的地方。
示例:
class MyView: UIView {
// Could be any initialize function which is called from your views
// awakeFromNib(), init(frame: CGRect), init?(coder aDecoder: NSCoder) etc.
func initialize() {
if ThemeManager.shared.theme == .dark {
self.backgroundColor = UIColor.myBGColorDark
} else {
self.backgroundColor = UIColor.myBGColorLight
}
NotificationCenter.default.addObserver(self, selector: #selector(appThemeChanged), name: Notification.Name.Theme.AppThemeChanged, object: nil)
}
@objc func appThemeChanged() {
if ThemeManager.shared.theme == .dark {
self.backgroundColor = UIColor.myBGColorDark
} else {
self.backgroundColor = UIColor.myBGColorLight
}
}
}
根据你对我的评论的评论,因为你想更新应用程序中的每个视图,并且你提供的有关现有架构的信息有限,并考虑到你的应用程序用于测试目的,这是我推荐的最简单解决方案。
为了保持一致性并确保完全应用您的主题,关闭并重新呈现视图控制器是演示主题更改的最简单选项,并且这种方法避免了退出应用程序并重新加载的需要。
我会有一个 UIViewController 用作启动视图,您可以在更改颜色主题时调用它(或需要完整的任何其他 UI 更改refresh) 来呈现然后返回到你原来的视图控制器。
让我们想象一下您的架构:
VC-1 是在呈现给 [=40= 之前在启动时短暂出现的内容]VC-2。在您的 viewDidAppear
方法中,您可以在 "n" 秒 之后进行 调度,然后显示(或 show
,但可能最好使用 present
) VC-2。
任何时候你更新你的主题,可以是颜色、字体和图标,然后你可以 dismiss
VC-2 和 present
VC-1 ,然后将重新呈现一个新实例VC-2 之后 n
在 调度中选择颜色在 之后调用 viewDidAppear
。
我有一种测试应用程序,我正在其中试听各种配色方案。该应用程序使用名为 myHighlight
和 mySecondaryColor
的全局颜色变量。我有一系列颜色我想试听。我有一个按钮,按下该按钮会将这些变量更改为我要测试的下一个颜色,但是如何让所有使用它们的视图重新加载并使用新值?调用 setNeedsDisplay()
不起作用,我假设是因为视图已经将它们的背景颜色存储为实例属性并且不再使用全局引用。有没有办法清除内存并让所有视图重新初始化,这样我就可以在不重新启动应用程序的情况下看到颜色变化的结果?
而不是在按下 button/switch 之后访问每个视图,使用 NotificationCenter
怎么样?这是一个可能适合您的解决方案:
- 创建自定义
Notification.Name
让我们称之为AppThemeChanged
- 从您想要更改颜色的视图订阅此通知
NotificationCenter.default.addObserver(self, selector: #selector(appThemeChanged), name: Notification.Name.AppThemeChanged, object: nil)
- 在
appThemeChanged
函数中重置颜色 - 当按钮被按下时通知视图
NotificationCenter.default.post(name: Notification.Name.AppThemeChanged, object: nil, userInfo: nil)
另外,我建议将选定的主题存储在共享实例或可全局访问的地方。
示例:
class MyView: UIView {
// Could be any initialize function which is called from your views
// awakeFromNib(), init(frame: CGRect), init?(coder aDecoder: NSCoder) etc.
func initialize() {
if ThemeManager.shared.theme == .dark {
self.backgroundColor = UIColor.myBGColorDark
} else {
self.backgroundColor = UIColor.myBGColorLight
}
NotificationCenter.default.addObserver(self, selector: #selector(appThemeChanged), name: Notification.Name.Theme.AppThemeChanged, object: nil)
}
@objc func appThemeChanged() {
if ThemeManager.shared.theme == .dark {
self.backgroundColor = UIColor.myBGColorDark
} else {
self.backgroundColor = UIColor.myBGColorLight
}
}
}
根据你对我的评论的评论,因为你想更新应用程序中的每个视图,并且你提供的有关现有架构的信息有限,并考虑到你的应用程序用于测试目的,这是我推荐的最简单解决方案。
为了保持一致性并确保完全应用您的主题,关闭并重新呈现视图控制器是演示主题更改的最简单选项,并且这种方法避免了退出应用程序并重新加载的需要。
我会有一个 UIViewController 用作启动视图,您可以在更改颜色主题时调用它(或需要完整的任何其他 UI 更改refresh) 来呈现然后返回到你原来的视图控制器。
让我们想象一下您的架构:
VC-1 是在呈现给 [=40= 之前在启动时短暂出现的内容]VC-2。在您的 viewDidAppear
方法中,您可以在 "n" 秒 之后进行 调度,然后显示(或 show
,但可能最好使用 present
) VC-2。
任何时候你更新你的主题,可以是颜色、字体和图标,然后你可以 dismiss
VC-2 和 present
VC-1 ,然后将重新呈现一个新实例VC-2 之后 n
在 调度中选择颜色在 之后调用 viewDidAppear
。