6 Star 43 Fork 8

internetwei / llDark

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

LLDark

License MIT  Carthage  CocoaPods  Platform  Support

适用于iOS的深色主题框架,快速简单的适配深色模式。
国内用户可以访问这个链接
github不显示图片解决方案

特性

  • 集成超级简单,仅需少量改动并且不破坏工程结构。
  • 高性能,仅在需要刷新时刷新当前页面UI。
  • 功能强大,涵盖所有UIColor、UIImage、CGColor的使用场景。
  • 兼容iOS13以下机型。
  • 支持从网络上获取深色主题配置。
  • 自动适配启动图为APP当前主题模式,支持iOS13以下机型。
  • 支持动态修改任意类型启动图。

Demo

Manual.gif System.gif Screen.gif LightVertical.gif

用法

前提

配置深色资源: 在工程任意NSObject分类(建议单独新建一个主题分类)中创建+ (NSDictionary<id, id> *)llDarkTheme类方法,字典的key表示浅色主题下的颜色/图片名称/图片地址,字典的value表示深色主题下的颜色/图片名称/图片地址。可参考样例代码:

+ (NSDictionary<id, id> *)llDarkTheme {
    return @{
             UIColor.whiteColor : kColorRGB(27, 27, 27),
             kColorRGB(240, 238, 245) : kColorRGB(39, 39, 39),
             [UIColor colorWithRed:14.0 / 255.0 green:255.0 / 255.0 blue:0.0 alpha:1.0] : [UIColor colorWithRed:0.0 green:14.0 / 255.0 blue:255.0 / 255.0 alpha:1.0],
             @"background_light" : @"background_dark",
             @"~/path/background_light.png" : @"~/path/background_dark.png",
    };
}

Tips: 1.不必把所有情况下的颜色/图片都填写进去,对于偶尔或少数使用到的深色颜色可以参考高级用法单独适配。 2.图片名称不用考虑倍图关系;如果填写的是图片路径一定要填写完整的图片路径(包含后缀)。

基本用法

UIColor和CGColor只需要追加.themeColor(nil)即可。 UIImage只需要将imageNamed或imageWithContentsOfFile替换为themeImage即可。

// UIColor
UIColor.redColor; // 之前的用法
UIColor.redColor.themeColor(nil); // 现在的用法

// CGColor
UIColor.redColor.CGColor; // 之前的用法
UIColor.redColor.themeCGColor(nil); // 现在的用法

// UIImage
[UIImage imageNamed:@"lightImageName"]; // 之前的用法
[UIImage themeImage:@"lightImageName"]; // 现在的用法

Tips: 1.themeImage适配了imageNamed和imageWithContentsOfFile两个方法,可以传递图片名称,也可以传递图片路径。 2.只有适配过的Color和Image在主题切换时才会刷新。

高级用法

1. themeColor()里面的参数如果是具体的Color对象,深色主题则会使用指定的Color对象刷新,
如果是nil则会返回llDarkTheme中配置的深色颜色刷新,
如果llDarkTheme未配置则会返回浅色主题下的颜色。

2. themeCGColor()参数的作用和themeColor()参数作用一样。

3. themeImage()2个参数,参数可以是图片名称,也可以是图片地址,
1个参数表示浅色主题下使用的图片(必填)
2个参数表示深色主题下使用的图片(可以为空)
2个参数为空的话和themeColor()为空的处理方式一样。

4. appearanceBindUpdater,所有继承自UIView的对象都拥有这个属性,
对象需要刷新时会调用它,可以在这里实现自己的刷新逻辑。
仅在需要刷新时会调用,主题更改不一定需要刷新UI

5. userInterfaceStyle,类似iOS13系统的overrideUserInterfaceStyle方法,
但是功能比overrideUserInterfaceStyle更加强大,
它支持所有的对象,例如CALayer
它支持iOS13以下的系统使用。

6. themeDidChange,所有对象都拥有这个属性,作用和ThemeDidChangeNotification一样,
themeDidChange会在对象释放时被释放掉,
可以在多个地方使用,不保证回调顺序,
不同于appearanceBindUpdater,只要主题发生改变就会调用themeDidChange

7. systemThemeDidChange,所有对象都拥有这个属性,作用和SystemThemeDidChangeNotification一样,
释放时机和themeDidChange一样,
可以在多个地方使用,不保证回调顺序,
只要系统主题发生改变就会调用systemThemeDidChange

8. darkStyle,所有UIImageView对象都拥有这个方法,用于适配没有深色图片的图片对象,例如网络图片。
darkStyle3个参数,第1个参数决定如何适配深色主题,目前有LLDarkStyleSaturationLLDarkStyleMask两种,
LLDarkStyleMask使用蒙层适配,LLDarkStyleSaturation通过降低原图饱合度适配。
2个参数决定蒙层透明度/饱合度值,具体使用可看源码注释。
3个参数可以为nil,使用LLDarkStyleSaturation时需要传递一个唯一字符串当做标识符,通常是图片的url
样例代码:
UIImageView *imageView = [[UIImageView alloc] init];
NSString *url = @"图片URL";
imageView.darkStyle(LLDarkStyleSaturation, 0.2, url);
// imageView.darkStyle(LLDarkStyleMask, 0.5, nil);

9. updateDarkTheme:,如果需要运行时修改深色主题配置信息,或者需要从网络上获取深色主题配置信息,可以使用updateDarkTheme:来达到目的。
请确保在第1UI对象加载前配置好深色主题信息,否则会无效。
样例代码:
NSDictionary *darkTheme = @{
    UIColor.whiteColor : kColorRGB(27, 27, 27),
    kColorRGB(240, 238, 245) : kColorRGB(39, 39, 39),
    [UIColor colorWithRed:14.0 / 255.0 green:255.0 / 255.0 blue:0.0 alpha:1.0] : [UIColor colorWithRed:0.0 green:14.0 / 255.0 blue:255.0 /  255.0 alpha:1.0],
    @"background_light" : @"background_dark",
    @"~/path/background_light.png" : @"~/path/background_dark.png",
};
[LLDarkSource updateDarkTheme:darkTheme];

10. thirdControlClassName,如果需要支持第3方控件的刷新方法,可以在appearanceBindUpdater中单独实现刷新逻辑,也可以按照如下方法实现刷新逻辑,更加推荐如下方法。
首先需要实现thirdControlClassName这个类方法,并返回一个数组,数组包含第3方控件的类名字符串。
然后实现refresh+类名字符串的对象方法,在方法里实现第3方控件的刷新逻辑,可以参考LLThird.m文件中已经实现的YYLabel的刷新逻辑。
详情可以下载工程查看Demo了解具体实现。

11. 如果需要在iOS13以下系统支持适配深色启动图,请将深色图片按照指定规则命名并放置在工程任意目录下。
命名规则:launchImage_<屏幕宽度>_<屏幕高度>
例如:launchImage_414_736,此深色启动图将会在iOS13以下系统并且屏幕宽高为414×736的机型切换至深色模式后出现。
如果想适配横图只需要将宽高位置互换即可,例如:launchImage_736_414
具体效果可以在iOS13以下系统运行Demo并切换至深色模式查看。
具体命名可以参考Demo工程中LaunchImage文件夹下的图片命名方式,它包含了所有iOS13以下机型的深色启动图(包括横屏,不包括iPhone6之前的机型)命名。

12. LLLaunchScreen提供了一些类方法,合理的使用这些类方法可以完美替换APP的任意启动图,包含“深色竖屏启动图”、“深色横屏启动图”、“浅色竖屏启动图”、“浅色横屏启动图”。
具体方法请查阅LLLaunchScreen.h文件。
使用方法可参考Demo

高级用法中第8条darkStyle方法的样例图(为了突出效果特意将饱合度和透明度调整的很低): 137a9000178656346577e

快速适配

仅需要3步即可快速完美适配深色主题模式:

  1. 配置深色主题资源,可参考前提,也可以参考高级方法9从网络获取主题资源。
  2. 将需要适配的Color和Image适配为主题Color和主题Image,适配方法可参考基础用法高级用法
  3. 运行工程,检查完整性。

Tips:

  1. 如果您需要适配WKWebView,可以点击链接参考文章进行适配。 2.默认情况下iOS13及以上系统自动适配启动图跟随APP主题模式变化,如果想在iOS13以下系统 也支持此功能,可以参考高级用法11高级用法12

安装

CocoaPods

  1. 在 Podfile 中添加 pod 'LLDark'。
  2. 执行 pod install --repo-update。
  3. 导入 <LLDark/LLDark.h>。

Carthage

  1. 在 Cartfile 中添加 github "internetWei/LLDark"
  2. 执行 carthage update --platform ios 并将生成的 framework 添加到你的工程。
  3. 导入 <LLDark/LLDark.h>。
  4. Xcode12生成Cartifle失败参考文章

手动安装

  1. 下载 LLDark 文件夹内的所有内容。
  2. 将LLDark文件夹添加(拖放)到你的工程。
  3. 导入 "LLDark.h"。

系统要求

该项目最低支持iOS9.0和Xcode10.0,如果想在更低系统上使用可以联系作者。

注意点

  1. LLDark不会修改状态栏样式,需要自己监听主题模式修改状态栏样式。
  2. 需要适配深色主题的图片资源建议不要放在Assets.xcassets中,测试发现富文本中的图片在主题切换时并不会刷新(使用imageNamed:加载),这是系统的BUG。解决办法就是将图片放在工程下,并且使用themeImage:加载。
  3. UIImage实例对象拥有一个imageWithRenderingMode:方法。调用此方法会重新生成并返回一个UIImage实例对象,这样会导致无法正常刷新。请使用renderingModeFrom方法代替。

已知问题

  • 暂时不支持其他主题模式,后续会支持多种主题自由搭配。

联系作者

如果你有更好的改进,please pull reqeust me

如果你有任何更好的意见,请创建一个Issue

可以通过此邮箱联系作者internetwei@foxmail.com

许可证

LLDark 使用 MIT 许可证,详情见 LICENSE 文件。

Copyright (c) 2020 internetwei <internetwei@foxmail.com> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

适用于iOS的强大深色主题框架,能帮您快速适配深色模式。 展开 收起
Objective-C 等 2 种语言
MIT
取消

发行版 (4)

全部
Fix

贡献者

全部

近期动态

加载更多
不能加载更多了
Objective-C
1
https://gitee.com/internetWei/llDark.git
git@gitee.com:internetWei/llDark.git
internetWei
llDark
llDark
master

搜索帮助