運(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)颅痊,如下圖所示
2斑响、需要用到SceneDelegate進(jìn)行開發(fā)或不想刪除該文件吗讶,且需要適配iOS13以前的版本。
解決核心:添加版本控制
(因?yàn)樵趇OS13以前的系統(tǒng)中沸停,沒有SceneDelegate文件,所以還是需要在AppDelegate方法中進(jìn)行根控制的設(shè)置)
2)在SceneDelegate中willConnectToSession方法里進(jìn)行根控制設(shè)置的時(shí)候也要添加相應(yīng)的版本控制昭卓,需要注意的是愤钾,此處初始化window的時(shí)候需要用WindowScene進(jìn)行初始化瘟滨,否則黑屏加載不出視圖。
其他適配問題:
1能颁、使用presentViewController推出頁面杂瘸,不會(huì)全屏,如圖
解決:設(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ì)不通過策彤!
5、三方SDK更新
各SDK(友盟匣摘、微信等)都根據(jù)iOS13進(jìn)行了更新店诗,有用到的需要去更新最新的SDK。
6音榜、暗黑適配
1庞瘸、圖片適配
如果項(xiàng)目中有需要適配暗黑模式的圖片,可以在Assets.xcassets中設(shè)置赠叼,具體需要什么樣式自己根據(jù)項(xiàng)目情況設(shè)置
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適配;