iOS开发

iOS DarkMode,暗黑主题完整实现

2021-08-16  本文已影响0人  xsgoing

1.UIColor

a.Assets创建

新建Color Set 设置mode和color

使用示例:

self.view.backgroundColor = [UIColor colorNamed:@"BgColor"];

b.代码创建

 UIColor *bgColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull traitCollection) {

        if (traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {

            return [UIColor blueColor];

        }

        else{

            return [UIColor cyanColor];

        }

    }];

2.UIImage

新建Image Set 添加图片

使用示例:

 [imageView setImage:[UIImage imageNamed:@"icon_profile"]];

3.监听主题变化

主题变化时会调用如下方法:

NSView

updateLayer()

draw(_:)

layout()

updateConstraints()


UIView

traitCollectionDidChange(_:)

layoutSubviews()

draw(_:)

updateConstraints()

tintColorDidChange()


UIViewController

traitCollectionDidChange(_:)

updateViewConstraints()

viewWillLayoutSubviews()

viewDidLayoutSubviews()


UIPresentationController

traitCollectionDidChange(_:)

containerViewWillLayoutSubviews()

containerViewDidLayoutSubviews()

可根据场景选择方法进行监听。如你是用的class非以上所列,可以通过监听app’s effectiveAppearance 属性。

注意:以上方法并非只有主题变化时才被调用,所以需要在方法中判断主题是否变化:

BOOL modeChanged = previousTraitCollection.userInterfaceStyle != [UITraitCollection currentTraitCollection].userInterfaceStyle;

4.主动切换主题

UIWindow *keyWindow = [UIApplication sharedApplication].windows.firstObject;

    if (keyWindow.overrideUserInterfaceStyle == UIUserInterfaceStyleDark)

    {

        keyWindow.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;

    }

    else

    {

        keyWindow.overrideUserInterfaceStyle = UIUserInterfaceStyleDark;

    }

以上即为iOS 13 Dark Mode的实现方式,如果其他未考虑到的场景,或有错误不足之处,欢迎指出。

上一篇下一篇

猜你喜欢

热点阅读