Python實戰社羣
Java實戰社羣
長按識別下方二維碼,按需求添加
掃碼關注添加客服
進Python社羣▲
掃碼關注添加客服
進Java社羣▲
轉自:布多
適用於iOS的強大深色主題框架,快速適配深色模式。
國內用戶可以訪問這個鏈接 https://gitee.com/internetWei/llDark
特性
• 集成簡單,只需改動少量代碼即可完美適配。
• 高性能,僅在需要更新頁面時更新指定頁面,有相關緩存策略縮短刷新時長。
• 功能強大,所有使用UIColor、UIImage、CGColor的地方均可完美適配。
• 兼容iOS13以下機型。
• 支持從網絡上獲取深色主題配置。
• 自動適配啓動圖爲APP當前主題模式。
Demo
用法
前提
配置深色資源:在工程任意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對象都擁有這個方法,用於適配沒有深色圖片的圖片對象,例如網絡圖片。darkStyle有3個參數,第1個參數決定如何適配深色主題,目前有LLDarkStyleSaturation和LLDarkStyleMask兩種,
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:來達到目的。請確保在第1個UI對象加載前配置好深色主題信息,否則會無效。
樣例代碼:
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瞭解具體實現。
高級用法中第8條darkStyle方法的樣例圖(爲了突出效果特意將飽合度和透明度調整的很低):
快速適配
僅需要3步即可快速完美適配深色主題模式,經測試大部分工程都能在0.5天內適配完成,少量工程1天內適配完成,極少需要1天以上的工作量進行適配。
1、配置深色主題資源,可參考前提
,也可以參考高級方法9
從網絡中獲取資源適配。
2、將需要適配的Color和Image適配爲主題Color和主題Image,適配方法可參考基礎用法
和高級用法
。
3、運行工程,檢查完整性。
Tips:
如果您還需要適配WKWebView
,可以點擊鏈接參考文章進行適配。
安裝
CocoaPods
1、將 cocoapods 更新至最新版本。
2、在 Podfile 中添加 pod 'LLDark'。
3、執行 pod install 或 pod update。
4、導入 。
手動安裝
1、下載 LLDark 文件夾內的所有內容。
2、將 LLDark 工程中的LLDark文件夾添加(拖放)到你的工程。
3、導入 "LLDark.h"。
系統要求
該項目最低支持iOS9.0和Xcode10.0,如果想在更低系統上使用請聯繫作者。
注意點
• 需要自己監聽主題模式修改狀態欄顏色。
已知問題
• 需要適配深色主題的圖片資源請不要放在Assets.xcassets中,否則可能會獲取不到。
• 暫時不支持其他主題模式,後續會支持多種主題自由搭配。
程序員專欄 掃碼關注填加客服 長按識別下方二維碼進羣
近期精彩內容推薦:
在看點這裏好文分享給更多人↓↓