【问题标题】:Objective-C - Change programmatically Gradient Background Color UIViewController When iOS 13 Dark Mode changedObjective-C - 当 iOS 13 暗模式更改时,以编程方式更改渐变背景颜色 UIViewController
【发布时间】:2020-01-28 05:11:27
【问题描述】:

我正在我的应用中实现 iOS 13 的深色模式 管理功能。我的 ViewController 的背景有问题。

我的视图控制器有一个使用CAGradientLayer 获得的背景渐变色。

当渐变从 深色模式 ---> 浅色模式浅色模式 ---> 深色模式转换时,我设法根据用户的选择更改了构成渐变的颜色 ..

我的问题是,当用户在后台发送我的应用程序以转到控制中心并更改模式时,我用于背景颜色的渐变颜色不会立即更改...

要获得渐变颜色更改,用户必须关闭应用并重新打开它。

一个非常糟糕的用户体验,所以我想问你如何解决这个问题......

这是我用来根据用户选择的iOS 模式更改渐变颜色的方法

- (void)viewDidLoad {
    [super viewDidLoad];

    [self setupBackground];
}

- (void)setupBackground {

    UIColor *secondaryColor = self.view.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark ? UIColor.customRedColor : UIColor.customGreenColor;

    CAGradientLayer *gradient = [CAGradientLayer layer];

    gradient.frame = UIApplication.sharedApplication.windows.firstObject.bounds;
    gradient.colors = @[(id)UIColor.customBlueColor.CGColor, (id)secondaryColor.CGColor];
    gradient.locations = @[@0.1, @0.9];

    [self.view.layer insertSublayer:gradient atIndex:0];
}

【问题讨论】:

    标签: ios objective-c uiviewcontroller uicolor ios-darkmode


    【解决方案1】:

    卡恩,

    在 iOS13 上使用 ObjC 实现暗模式有很多困难,但幸运的是,一群 Devs e 设计师做了一个非常简单的方法:

    https://medium.com/flawless-app-stories/implementing-dark-mode-on-ios-d195cac098de

    最好的问候。 o/

    【讨论】:

      【解决方案2】:

      您应该实现traitCollectionDidChange 并让它更新您的背景:

      - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
          [super traitCollectionDidChange:previousTraitCollection];
      
          if (@available(iOS 13.0, *)) { // Needed if your app supports iOS 12
              if ([self.traitCollection hasDifferentColorAppearanceComparedToTraitCollection:previousTraitCollection]) {
                  [self setupBackground];
              }
          }
      }
      

      当然这意味着setupBackground会被调用很多次。所以你应该更新它,这样它就不会每次都添加一个新层。

      【讨论】:

      • 非常感谢 .. 我在想一个不同的解决方案 .. 如果我错了请告诉我 .. 如果我创建两个背景图像并将它们插入到资产中(无论是为了借口还是为了明确的)不是更好吗?我会在正确的方法上避免双重调用问题吗?
      • 渐变效果更好。对于图像,随着视图大小的变化(例如旋转设备或在 iPad 上支持拆分模式),它会变得混乱。
      • 我尝试实现您建议的方法,但是当我转到后台将暗模式设置为设备上的设置时,背景不会改变:(
      • 是否调用了setupBackground?它得到正确的颜色吗?您确定视图中只有一层吗?
      • 在视图控制器上方(渐变应用于其背景)我只有另一个 1 视图 5 标签、1 按钮和 1 开关。设置方法[self setupBackground];第一次在视图中调用确实加载以指示渐变,然后在 traitCollectionDidChange 中调用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 2019-04-22
      • 1970-01-01
      相关资源
      最近更新 更多