工程在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的選項:
如何使用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的視圖層級嵌纲。
從上圖中,我們可以看到腥沽,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