iOS13出來已經(jīng)挺久了蛋勺,今天才認(rèn)真的看了看深色模式的魅力凹髓,老工程適配深色模式的確會(huì)是個(gè)龐大的工程,這篇文章記錄一下奶陈,今天下午簡單做了些適配深色模式的功課易阳。
1. 顏色適配
在iOS13中系統(tǒng)提供了動(dòng)態(tài)顏色的方法:
+ (UIColor *)colorWithDynamicProvider:(UIColor * (^)(UITraitCollection *traitCollection))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
- (UIColor *)initWithDynamicProvider:(UIColor * (^)(UITraitCollection *traitCollection))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
我們可以直接封裝一個(gè)UIColor的類別來獲取不同模式下的顏色:
+(UIColor *)colorWithDarkModeColor:(UIColor *)darkColor normalColor:(UIColor *)color
{
if (@available(iOS 13.0,*)) {
UIColor *dyColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull trainCollection) {
if ([trainCollection userInterfaceStyle] == UIUserInterfaceStyleDark) {
return darkColor;
}
else {
return color;
}
}];
return dyColor;
}
return color;
}
這樣,我們在使用的時(shí)候就可以方便的調(diào)用吃粒,當(dāng)模式改變后潦俺,系統(tǒng)會(huì)自己根據(jù)是否是深色模式更改不同的顏色:
UIColor *color = [UIColor colorWithDarkModeColor:[UIColor blackColor] normalColor:[UIColor whiteColor]];
[self.view setBackgroundColor:color];
如果遇到一些比較特殊的情況,比如隱藏一些空間或者改變漸變顏色之類的需求徐勃,那我們就需要監(jiān)聽用戶模式的改變事示,這個(gè)方法在UIViewController和UIView中都可以直接調(diào)用:
- (void)traitCollectionDidChange:(nullable UITraitCollection *)previousTraitCollection API_AVAILABLE(ios(8.0));
///Example
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
[super traitCollectionDidChange:previousTraitCollection];
NSLog(@"-----current-%ld\n=====previous=%ld",self.traitCollection.userInterfaceStyle,previousTraitCollection.userInterfaceStyle);
// trait發(fā)生了改變
if ([self.traitCollection hasDifferentColorAppearanceComparedToTraitCollection:previousTraitCollection]) {
}
}
2. 圖片適配
在Asset里面,Xcode在Appearance里可以選擇不同的模式僻肖,一般情況下我們只用適配深色模式和非深色模式肖爵,如圖:
然后代碼里就直接寫:
imgView.image=[UIImage imageNamed:@"iconImage"];
這點(diǎn),很符合蘋果的個(gè)性檐涝,就是這么隨意遏匆,改變模式后自動(dòng)更改圖片,開發(fā)者不用再做其他的事情谁榜。
也許很多開發(fā)者會(huì)發(fā)現(xiàn)幅聘,大廠的應(yīng)用,所有的圖標(biāo)都很簡單窃植,線性帝蒿,單色等特點(diǎn),有抖音的可以看下抖音的圖標(biāo)(點(diǎn)贊巷怜、評論葛超、分享、查找...)延塑,看過后相信有人會(huì)直接想到iconfont這個(gè)東西绣张,沒錯(cuò),如果你們的應(yīng)用之前考慮過瘦身关带,應(yīng)該看到過使用iconfont來瘦身的文章侥涵。舉個(gè)例子下面這些圖標(biāo):
如果是png格式的話,最起碼需要
50kb
空間宋雏,再加上適配深色模式double一下就是100kb
!那么如果用iconfont的話芜飘,大小之后2kb
,而且可以隨便改尺寸磨总。整整50
倍嗦明,什么概念。用了iconfont的話在適配深色模式的時(shí)候也會(huì)比較簡單蚪燕,就像顏色適配一樣的容易娶牌,最后動(dòng)圖中的下面3個(gè)圖標(biāo)都是用的iconfont奔浅。
label.font = [UIFont imageFontWithSize:34.0];
label.text = @"\U0000e668";
label.textColor=[UIColor colorWithDarkModeColor:[UIColor lightGrayColor] normalColor:[UIColor redColor]];
里面用到了一個(gè)UIFont的類別方便加載iconfont:
+(UIFont *)imageFontWithSize:(CGFloat)fontSize
{
return [UIFont fontWithName:@"iconFont" size: fontSize];
}
簡單做了個(gè)小小Demo放在了GitHub-iOS深色模式
上,效果圖如下: