iOS項目適配iOS13(Xcode11)

工程在Xcode11上編譯失敗的一些報錯览露,自行修改即可口糕,大部分情況應該是代碼不夠規(guī)范導致的。至于這里带迟,則主要總結下工程在Xcode11上正常編譯后音羞,在iOS13系統(tǒng)手機上的一些問題。

問題一:

使用UITextField時仓犬,它的私有屬性_placeholderLabel被禁止訪問了

[_textField setValue:[UIFont boldSystemFontOfSize:14] forKeyPath:@"_placeholderLabel.font"];

在Xcode11上運行上述代碼會崩潰嗅绰,崩潰信息如下:

reason: 'Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug'

iOS 13 通過 KVC 方式修改私有屬性,有 Crash 風險搀继,需謹慎使用窘面!并不是所有KVC都會Crash,要嘗試律歼!

刪除上述方法中@"_placeholderLabel.font"里的“_”民镜,程序可以正常工作,但是不建議這樣做险毁。

解決措施1制圈,通過以下方法實現對placeholder屬性的設置:

_textField.attributedPlaceholder = [[NSAttributedString alloc]initWithString:NSLocalizedString(@"請輸入關鍵字", nil) attributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:14], NSForegroundColorAttributeName:HexString(@"#A6A6A6")}];

解決措施2们童,需要添加頭文件#import <objc/runtime.h>

Ivar ivar = class_getInstanceVariable([UITextField class], "_placeholderLabel");

UILabel*placeholderLabel =object_getIvar(_textField, ivar);

placeholderLabel.textColor= [UIColorredColor];

問題二:

通過presentViewController彈出的模態(tài)控制器,彈出方式及效果和iOS13以前不同鲸鹦,這是因為UIViewController里的一個屬性modalPresentationStyle的默認值發(fā)生了改變慧库。在iOS13之前,這個屬性的默認值是UIModalPresentationFullScreen馋嗜,而在iOS13之后齐板,默認值變成了UIModalPresentationAutomatic。和Xcode無關葛菇,只和iOS系統(tǒng)有關甘磨。

當然,嚴格意義上來說眯停,這也不能算是一個問題济舆,如果不能接受新的彈出效果,則只需要將控制器的modalPresentationStyle屬性設置下即可莺债。為避免一處處去修改滋觉,我們可以通過UIViewController分類、重寫presentViewController等方式去實現齐邦。

問題三:

MPMoviePlayerController已經被棄用椎侠,在Xcode11上會Crash,信息如下:

reason: 'MPMoviePlayerController is no longer available. Use AVPlayerViewController in AVKit.'

解決措施:需要使用AVKit框架里的AVPlayerViewController來替代

問題四:

LaunchImage即將廢棄措拇,得使用LaunchScreen來進行替換

從 iOS 8 的時候我纪,蘋果就引入了 LaunchScreen,我們可以設置 LaunchScreen來作為啟動頁丐吓。當然宣羊,現在你還可以使用LaunchImage來設置啟動圖。不過使用LaunchImage的話汰蜘,要求我們必須提供各種屏幕尺寸的啟動圖,來適配各種設備之宿,隨著蘋果設備尺寸越來越多族操,這種方式顯然不夠 Flexible。而使用 LaunchScreen的話比被,情況會變的很簡單色难, LaunchScreen是支持AutoLayout+SizeClass的,所以適配各種屏幕都不在話下等缀。

注意啦?枷莉,從2020年4月開始,所有使? iOS13 SDK的 App將必須提供 LaunchScreen尺迂,LaunchImage即將退出歷史舞臺

同時我們也可以看到笤妙,在Xcode11上冒掌,已經沒有了LaunchImage的選項:

圖1

如何使用LaunchScreen適配各種機型的手機?

如果單純使用一張啟動圖蹲盘,是無法適配各種機型的股毫,因為同一張圖在不同機型上可能會被拉伸變形。

因此召衔,我們可以把一張啟動圖拆分開铃诬,拆成單獨的元素,在storyboard進行自動布局苍凛,這樣的話趣席,就可以適配不同的機型、橫豎屏等情況了醇蝴。

關于啟動頁實現宣肚、布局等內容具體可以參考一下鏈接:

啟動頁黑屏或白屏:http://www.reibang.com/p/d2b0f20e2e96

啟動頁強制豎屏,啟動后可以橫豎屏:https://www.coder4.com/archives/5406

使用Storyboard按比例自動布局技巧:https://blog.csdn.net/ws1352864983/article/details/52441938

問題五:

UIWindow哑蔫,視圖層級發(fā)生了變化钉寝,如下圖,分別是Xcode11和Xcode11以前的版本下闸迷,UIWindow的視圖層級嵌纲。

Xcode11
Xcode11以前

從上圖中,我們可以看到腥沽,UIWindow下的第一個子視圖不再是UILayoutContainerView逮走,而是多出了UITransitionView、UIDropShadowView今阳。

因此如果在iOS13上师溅,我們如果想通過一下代碼獲取第一響應者,是獲取不到的

frontView = [[window subviews] objectAtIndex:0];

nextResponder = [frontView nextResponder];//iOS13上盾舌,獲取到的還是UIWindow(UITransitionView)

那么墓臭,如果我們在Xcode11下,還想要獲取到UILayoutContainerView怎么辦呢妖谴?可以通過類似下面的方式獲取到

? ? ? ? ? ? do {

? ? ? ? ? ? ? ? frontView = [[frontView subviews] objectAtIndex:0];

? ? ? ? ? ? } while ([frontView isKindOfClass:[UIView class]] && ![[frontView nextResponder] isKindOfClass:[UIViewController class]]);

問題六:

[[UIApplication sharedApplication] keyWindow] 方法即將被廢棄窿锉,被標記為API_DEPRECATED

我們可以看下官方描述:

@property(nullable, nonatomic,readonly) UIWindow *keyWindow API_DEPRECATED("Should not be used for applications that support multiple scenes as it returns a key window across all connected scenes", ios(2.0, 13.0));

官方描述的意思是,不應用于在返回時支持多個場景的應用程序膝舅。而如果我們的程序只支持單一場景的話嗡载,

我們可以在Xcode11上分別獲取keywindow、windows里的subwindow來打印看看

test window ++++ keywindow :<UIWindow: 0x109600ec0; frame = (0 0; 834 1194); autoresize = W+H; gestureRecognizers = <NSArray: 0x283793f90>; layer = <UIWindowLayer: 0x2839ca8a0>>

test window --- subwindow :<UIWindow: 0x109600ec0; frame = (0 0; 834 1194); autoresize = W+H; gestureRecognizers = <NSArray: 0x283793f90>; layer = <UIWindowLayer: 0x2839ca8a0>>

test window --- subwindow :<UITextEffectsWindow: 0x10964b680; frame = (0 0; 834 1194); opaque = NO; autoresize = W+H; layer = <UIWindowLayer: 0x28399a620>>

可以得出結論仍稀,對于這種只支持單一場景的應用來說洼滚,可以使用[[[UIApplication sharedApplication] windows] objectAtIndex:0]來替換keywindow的方法。

tips:至于UITextEffectsWindow是什么東西技潘,可以看這個

問題七:

WKWebView?中測量頁面內容高度的方式變更如下

iOS 13以前 document.body.scrollHeight?

iOS 13中 document.documentElement.scrollHeight 兩者相差55 應該是瀏覽器定義高度變了


問題八:

暗黑模式遥巴,若當前需要屏蔽暗黑模式千康,則需要在plist文件中增加一下配置項即可:

<key>UIUserInterfaceStyle</key>

<string>Light</string>

問題九:

presentViewController子線程執(zhí)行時,會引發(fā)Crash挪哄,必須在主線程執(zhí)行吧秕。

通常來說,大家都知道迹炼,UI操作必須放到主線程中執(zhí)行砸彬,但是,在Xcode11以前斯入,我們在使用presentViewController時砂碉,在子線程也可以正常使用,我們在器block中打印刻两,發(fā)現已經回到了主線程增蹭。可以猜測磅摹,如果在子線程中使用presentViewController滋迈,系統(tǒng)會強制將其拉回到主線程中執(zhí)行,所以不會引發(fā)異常户誓。

但是饼灿,使用Xcode11后,在子線程使用presentViewController帝美,會直接引發(fā)Crash碍彭,

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'threading violation: expected the main thread'

所以,切記悼潭,一切的UI操作都要放到主線執(zhí)行庇忌。


參考鏈接:

https://www.jb51.net/article/169852.htm

http://www.reibang.com/p/a93a6f18b6c4

http://www.reibang.com/p/2ac8dbdcc88f/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市舰褪,隨后出現的幾起案子皆疹,更是在濱河造成了極大的恐慌,老刑警劉巖占拍,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墙基,死亡現場離奇詭異,居然都是意外死亡刷喜,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門立砸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掖疮,“玉大人,你說我怎么就攤上這事颗祝∽巧粒” “怎么了恼布?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長搁宾。 經常有香客問我折汞,道長,這世上最難降的妖魔是什么盖腿? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任爽待,我火速辦了婚禮,結果婚禮上翩腐,老公的妹妹穿的比我還像新娘鸟款。我一直安慰自己,他們只是感情好茂卦,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布何什。 她就那樣靜靜地躺著,像睡著了一般等龙。 火紅的嫁衣襯著肌膚如雪处渣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天蛛砰,我揣著相機與錄音罐栈,去河邊找鬼。 笑死暴备,一個胖子當著我的面吹牛悠瞬,可吹牛的內容都是我干的。 我是一名探鬼主播涯捻,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼浅妆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了障癌?” 一聲冷哼從身側響起凌外,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涛浙,沒想到半個月后康辑,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡轿亮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年疮薇,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片我注。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡按咒,死狀恐怖,靈堂內的尸體忽然破棺而出但骨,到底是詐尸還是另有隱情励七,我是刑警寧澤智袭,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站掠抬,受9級特大地震影響吼野,放射性物質發(fā)生泄漏。R本人自食惡果不足惜两波,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一瞳步、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雨女,春花似錦谚攒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讼稚,卻和暖如春括儒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锐想。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工帮寻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赠摇。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓固逗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親藕帜。 傳聞我的和親對象是個殘疾皇子烫罩,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351