【发布时间】:2017-02-16 13:10:50
【问题描述】:
目前,我正在开发基于文章的应用程序。它具有日/夜阅读模式功能。夜间模式的应用程序背景颜色应为黑色,前景组件应为白色。我已经为 UIView、UILabel、UIButton 和 UITextView 创建了类别,但我不知道这是不是正确的方法。请给我一些建议。
如何在iOS应用中实现/实现Day/Night模式?
【问题讨论】:
标签: ios objective-c uiappearance
目前,我正在开发基于文章的应用程序。它具有日/夜阅读模式功能。夜间模式的应用程序背景颜色应为黑色,前景组件应为白色。我已经为 UIView、UILabel、UIButton 和 UITextView 创建了类别,但我不知道这是不是正确的方法。请给我一些建议。
如何在iOS应用中实现/实现Day/Night模式?
【问题讨论】:
标签: ios objective-c uiappearance
我认为您最好的选择是使用外观代理而不是类别。任何子类 UIView(所以基本上是任何 UI)都会向您展示它。
只需将这些设置为您想要的外观,默认情况下所有元素都会继承此外观。举个例子:
[[UIButton appearance] setBackgroundColor:[UIColor blackColor]];
[[UIButton appearance] setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
现在所有 UIButtons 都将默认具有这些属性。
您可以简单地在您的应用在一天中的某个时间启动时实施检查,然后根据此设置 UI 的外观。
【讨论】:
如果您这样做,例如:UILabel.appearance().textColor = UIColor.white,那很好。
只是不要忘记在启用暗模式时设置 UserDefaults 键,以便在重新启动应用程序时保持以前的外观。此外,您可能希望将导航控制器、选项卡栏和键盘设置为黑色,将状态栏元素和导航控制器和选项卡栏的标题设置为白色(在 AppDelegate 中,didFinishLaunchingWithOptions:
UINavigationBar.appearance().barTintColor = UIColor.black
UIApplication.shared.statusBarStyle = .lightContent
UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName:UIColor.white]
UITabBar.appearance().barTintColor = UIColor.black
【讨论】:
我通过制作外观管理器实现了类似的行为,可以使用不同的配色方案进行配置。在其中我有如下功能:
-(UIColor*) colorForLabelInHomeScreen;
之后,您将需要一个用户默认值来保留您当前的配色方案,并在用户更改配色方案后重新加载您的屏幕(触发通知,因为它的一对多关系是一个不错的选择)。
这种方法的一个优点是可以很容易地使用新的配色方案进行扩展。
【讨论】: