升級Xcode11后多望,新建項(xiàng)目在iOS13上黑屏解決及其他適配(含暗黑適配)

更新Xcode之后嫩舟,新項(xiàng)目需求,新建項(xiàng)目發(fā)現(xiàn)多了如圖1所示兩個(gè)新的文件SceneDelegate.h和SceneDelegate.m
圖1.png

運(yùn)行之后發(fā)現(xiàn)黑屏怀偷,無論是真機(jī)還是模擬器都不行家厌,換到iOS12的手機(jī)上則可以正常運(yùn)行。
查看官方文檔椎工,SceneDelegate是為了優(yōu)化啟動(dòng)和實(shí)現(xiàn)iPad多任務(wù)處理功能(在ipad上同時(shí)打開多個(gè)窗口)做出的改動(dòng)饭于,將原本在AppDelegate里的生命周期相關(guān)方法和window分離出來
iOS13以前:AppDelegate管理App的生命周期和UI生命周期;
iOS13以后:AppDelegate管理App的生命周期和新增的UISceneSession生命周期维蒙,新增SceneDelegate文件來管理UI生命周期和window掰吕;
關(guān)于解決有兩種情況:
1、不開發(fā)iPadOS多窗口App
1)將新增的SceneDelegate文件刪除
2)刪除info.plist文件中Application Scene Manifest選項(xiàng)颅痊,如下圖所示


info.png
3)在AppDelegate中新增window屬性殖熟,在didFinishLaunchingWithOptions方法中跟往常一樣進(jìn)行相應(yīng)根控制設(shè)置及處理,并刪除新增的UISceneSession兩個(gè)方法
AppDelegate.m

2斑响、需要用到SceneDelegate進(jìn)行開發(fā)或不想刪除該文件吗讶,且需要適配iOS13以前的版本。
解決核心:添加版本控制

1)AppDelegate中增加window屬性恋捆,在didFinishLaunchingWithOptions方法中用if (@available(iOS 13.0, *)){}進(jìn)行版本控制,UISceneSession lifecycle里的兩個(gè)方法也要添加版本控制重绷,如下圖所示
AppDelegate.png

(因?yàn)樵趇OS13以前的系統(tǒng)中沸停,沒有SceneDelegate文件,所以還是需要在AppDelegate方法中進(jìn)行根控制的設(shè)置)
2)在SceneDelegate中willConnectToSession方法里進(jìn)行根控制設(shè)置的時(shí)候也要添加相應(yīng)的版本控制昭卓,需要注意的是愤钾,此處初始化window的時(shí)候需要用WindowScene進(jìn)行初始化瘟滨,否則黑屏加載不出視圖。


SceneDelegate.png

其他適配問題:

1能颁、使用presentViewController推出頁面杂瘸,不會(huì)全屏,如圖

圖2.png
原因:在iOS13之前伙菊,VC的modalPresentationStyle屬性默認(rèn)值為UIModalPresentationFullScreen败玉,而在iOS13中改為了UIModalPresentationAutomatic
解決:設(shè)置vc.modalPresentationStyle = UIModalPresentationFullScreen;
2、私有KVC使用崩潰
運(yùn)行之前項(xiàng)目突然崩潰镜硕,定位到UITextField 的Placeholder文字顏色設(shè)置

[self.phoneTextField setValue:[UIColor colorWithHexString:@"#888888"] forKeyPath:@"_placeholderLabel.textColor"];
[self.passwordTextField setValue:[UIColor colorWithHexString:@"#888888"] forKeyPath:@"_placeholderLabel.textColor"];
[self.registeTextField setValue:[UIColor colorWithHexString:@"#888888"] forKeyPath:@"_placeholderLabel.textColor"];

有兩種解決方案:

//方法1:去掉下劃線訪問placeholderLabel
[self.phoneTextField setValue:[UIColor blueColor] forKeyPath:@"placeholderLabel.textColor"];
[self.phoneTextField setValue:[UIFont systemFontOfSize:20] forKeyPath:@"placeholderLabel.font"];
//方法2:改為修改并賦值屬性字符串
NSMutableAttributedString * attributeStr = [[NSMutableAttributedString alloc] initWithString:@"請輸入手機(jī)號(hào)" attributes:@{NSForegroundColorAttributeName : [UIColor redColor], NSFontAttributeName : [UIFont systemFontOfSize:14.0f]}];
self.phoneTextField.attributedPlaceholder = attributeStr;

3运翼、隱藏tabbar上方黑色橫線
由于之前的[UIImage new]方法已經(jīng)不奏效,且在iOS13之后引入了UITabBarAppearance兴枯,所以需要修改為

//去除頂部橫線
    if (@available(iOS 13.0, *)) {
        UITabBarAppearance * tabbarAppearance = self.standardAppearance;
        tabbarAppearance.shadowImage = [UIImage imageWithColor:[UIColor clearColor]];
        tabbarAppearance.backgroundImage = [UIImage imageWithColor:[UIColor clearColor]];
        self.standardAppearance = tabbarAppearance;
    } else {
        [self setBackgroundImage:[UIImage imageWithColor:[UIColor clearColor]]];
        [self setShadowImage:[UIImage imageWithColor:[UIColor clearColor]]];
    }

其中[UIImage imageWithColor:[UIColor clearColor]是自定義UIImage分類方法 -- 根據(jù)顏色生成圖片方法血淌,self為繼承于UITabBar的自定義tab,如果引入相應(yīng)不同項(xiàng)目的時(shí)候需要自己做相應(yīng)改動(dòng)财剖。附上根據(jù)顏色生成圖片的方法:

#import "UIImage+LSImageWithColor.h"
@implementation UIImage (LSImageWithColor)

+ (UIImage *)imageWithColor:(UIColor *)color {
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return image;
}

@end

4悠夯、UIWebView徹底棄用
iOS13上,蘋果在UIWebView的使用上明確標(biāo)注了僅支持iOS2~iOS12的系統(tǒng)躺坟,項(xiàng)目中有用到UIWebView的需要全部替換成WKWebView沦补,如果需要適配 iOS 7 的可以通過 openURL 的方式在 Safari 打開。如果沒有修改瞳氓,提交審核將會(huì)不通過策彤!

UIWebView.png

5、三方SDK更新
各SDK(友盟匣摘、微信等)都根據(jù)iOS13進(jìn)行了更新店诗,有用到的需要去更新最新的SDK。

6音榜、暗黑適配
1庞瘸、圖片適配
如果項(xiàng)目中有需要適配暗黑模式的圖片,可以在Assets.xcassets中設(shè)置赠叼,具體需要什么樣式自己根據(jù)項(xiàng)目情況設(shè)置

圖片設(shè)置.png

2擦囊、UIColor適配
iOS13之后UIColor增加了兩個(gè)初始化方法來動(dòng)態(tài)創(chuàng)建UIColor:

//類方法
+ (UIColor *)colorWithDynamicProvider:(UIColor * (^)(UITraitCollection *traitCollection))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchOS);
//實(shí)例方法
- (UIColor *)initWithDynamicProvider:(UIColor * (^)(UITraitCollection *traitCollection))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);

當(dāng)系統(tǒng)切換模式的時(shí)候嘴办,會(huì)自動(dòng)觸發(fā)這兩個(gè)方法來動(dòng)態(tài)修改控件顏色瞬场,所以可以根據(jù)需要使用這兩種方法來進(jìn)行顏色設(shè)置,一般寫在基類或者UIColor分類中涧郊。

//UIColor分類中增加方法
+ (UIColor *)colorWithLightColor:(UIColor *)color withDarkColor:(UIColor *)darkColor{
    if (@available(iOS 13.0, *)) {
       UIColor *dyColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull traitCollection) {
            if (traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
                return darkColor;
            }
            return color;
        }];
        return dyColor;
    }
    return color;
}

//調(diào)用
self.view.backgroundColor = [UIColor colorWithLightColor:[UIColor whiteColor] withDarkColor:[UIColor blackColor]];

iOS13之后系統(tǒng)也提供了一些動(dòng)態(tài)的顏色贯被,如果直接設(shè)置提供的那些動(dòng)態(tài)顏色,則不需要使用上面的方法,照常直接設(shè)置即可彤灶,系統(tǒng)會(huì)自動(dòng)更改顏色看幼,如:labelColor,systemBrownColor等幌陕。

3诵姜、CGColor適配
CGColor在iOS13之后依然只能表示一種顏色,所以在切換模式后直接返回當(dāng)前頁面時(shí)搏熄,設(shè)置的CGColor并不會(huì)動(dòng)態(tài)改變棚唆,此時(shí)需要調(diào)用監(jiān)聽模式切換的方法:
在用到CGColor的VC中重寫-(void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection方法,將layer顏色設(shè)置重新寫一遍

-(void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection{
    [super traitCollectionDidChange:previousTraitCollection];
    self.logoutBtn.layer.borderColor = [UIColor colorWithHexString:@"#d6d7dc" withDarkHexString:@"#000000"].CGColor;
}

注:這個(gè)方法是重寫一遍layer顏色設(shè)置搬卒,而不是只在該方法中設(shè)置顏色瑟俭,因?yàn)樵摲椒ㄊ窃谇袚Q模式的時(shí)候觸發(fā),如果沒有切換模式契邀,也沒有在其他地方設(shè)置顏色摆寄,那么你將得不到顏色。

4坯门、設(shè)置單個(gè)VC的模式

if (@available(iOS 13.0, *)) {
        [self setOverrideUserInterfaceStyle:UIUserInterfaceStyleDark];
    } else {

    }

僅限于當(dāng)前VC微饥,推出或返回的VC依然是跟隨系統(tǒng)模式。

7古戴、關(guān)于LaunchImage
wwdc2019中說在2020年4月之后欠橘,所有支持iOS13的App必須提供LaunchScreen.storyboard,否則無法提交到 App Store现恼。
設(shè)置步驟:
1)將啟動(dòng)圖拖入Assets.xcassets中
2)在LaunchScreen.storyboard中拖入ImageView肃续,設(shè)置全屏約束,設(shè)置圖片叉袍,完成
注意:
1)如果運(yùn)行沒有出現(xiàn)啟動(dòng)圖始锚,是因?yàn)榫彺鎲栴},刪除App重新運(yùn)行喳逛,再不行瞧捌,重啟模擬器即可
2)真機(jī)使用Xcode安裝了app,設(shè)置啟動(dòng)頁之后上傳AppStore審核通過润文,在AppStore下載app之前最好先卸載掉原先的姐呐,否則會(huì)出現(xiàn)啟動(dòng)頁雖然能成功顯示,但是在顯示之前還有一小段時(shí)間顯示白屏典蝌。

8曙砂、關(guān)于UISegmentedControl
1、設(shè)置UISegmentedControl的選中段背景色使用新屬性selectedSegmentTintColor骏掀,以前的tintColor不起作用:

if (@available(iOS 13.0, *)) {
        segement.selectedSegmentTintColor = [UIColor orangeColor];
    } else {
        // Fallback on earlier versions
        segement.tintColor = [UIColor orangeColor];
    }

2麦轰、設(shè)置圓角
以前的segement.layer.cornerRadius = 8;沒有效果乔夯,需要重寫UISegmentedControl的layoutSubviews方法來設(shè)置圓角:

- (void)layoutSubviews
{
    [super layoutSubviews];
    self.layer.cornerRadius = 8;
}

另外如果要設(shè)置segement的背景圖片,需要Normal和Selected兩種狀態(tài)都設(shè)置款侵,不然不起效果(這個(gè)不是新特性,就是個(gè)小tip侧纯,我設(shè)置的時(shí)候沒注意這點(diǎn)新锈,一直不起作用,看過解釋才知道):

[segement setBackgroundImage:[UIImage imageNamed:@""] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[segement setBackgroundImage:[UIImage imageNamed:@""] forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];

(目前項(xiàng)目中出現(xiàn)的問題大致就這些眶熬,其他問題歡迎補(bǔ)充)
關(guān)于更新:
2020.04.15 在其他適配問題的第6點(diǎn)中補(bǔ)充暗黑模式適配妹笆;
2021.12.29 在其他適配問題中新增UISegmentedControl適配;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末娜氏,一起剝皮案震驚了整個(gè)濱河市拳缠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贸弥,老刑警劉巖窟坐,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绵疲,居然都是意外死亡哲鸳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門盔憨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來徙菠,“玉大人,你說我怎么就攤上這事郁岩⌒霰迹” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵问慎,是天一觀的道長萍摊。 經(jīng)常有香客問我,道長蝴乔,這世上最難降的妖魔是什么记餐? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮薇正,結(jié)果婚禮上片酝,老公的妹妹穿的比我還像新娘。我一直安慰自己挖腰,他們只是感情好雕沿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猴仑,像睡著了一般审轮。 火紅的嫁衣襯著肌膚如雪肥哎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天疾渣,我揣著相機(jī)與錄音篡诽,去河邊找鬼。 笑死榴捡,一個(gè)胖子當(dāng)著我的面吹牛杈女,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吊圾,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼达椰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了项乒?” 一聲冷哼從身側(cè)響起啰劲,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎檀何,沒想到半個(gè)月后蝇裤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埃碱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年猖辫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砚殿。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啃憎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出似炎,到底是詐尸還是另有隱情辛萍,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布羡藐,位于F島的核電站贩毕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏仆嗦。R本人自食惡果不足惜辉阶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘩扼。 院中可真熱鬧谆甜,春花似錦、人聲如沸集绰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽栽燕。三九已至罕袋,卻和暖如春改淑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浴讯。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工朵夏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人榆纽。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓侍郭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掠河。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容