iOS13適配

1.私有KVC

[self setValue:baseTabBar forKey:@"tabBar"]; //正常

[_textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];///崩潰
[_textField setValue:[UIFont systemFontOfSize:14] forKeyPath:@"_placeholderLabel.font"];///崩潰

_textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"姓名" attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14],NSForegroundColorAttributeName:[UIColor redColor]}]; ///新的實現
複製代碼

在Xcode10上編譯不會有問題,可是在Xcode11上編譯的會崩潰。而且- (void)setValue:(nullable id)value forKey:(NSString *)key方法沒問題,- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath會崩潰git

2.presentViewController的問題

會出現這種狀況是主要是由於咱們以前對UIViewController裏面的一個屬性,即modalPresentationStyle(該屬性是控制器在模態視圖時將要使用的樣式)沒有設置須要的類型。在iOS13中modalPresentationStyle的默認改成UIModalPresentationAutomatic,而在以前默認是UIModalPresentationFullScreen。github

這個不受Xcode版本的影響,只要是iOS13的系統,沒有顯式設置modalPresentationStyle,就會有這個問題瀏覽器

3.即將廢棄的 LaunchImage

從 iOS 8 的時候,蘋果就引入了 LaunchScreen,咱們能夠設置 LaunchScreen來做爲啓動頁。固然,如今你還可使用LaunchImage來設置啓動圖。不過使用LaunchImage的話,要求咱們必須提供各類屏幕尺寸的啓動圖,來適配各類設備,隨着蘋果設備尺寸愈來愈多,這種方式顯然不夠 Flexible。而使用 LaunchScreen的話,狀況會變的很簡單, LaunchScreen是支持AutoLayout+SizeClass的,因此適配各類屏幕都不在話下。 注意啦⚠️,從2020年4月開始,全部使⽤ iOS13 SDK 的 App 將必須提供 LaunchScreen,LaunchImage即將退出歷史舞臺bash

4.暗黑模式

原理app

1.將同一個資源,建立出兩種模式的樣式。系統根據當前選擇的樣式,自動獲取該樣式的資源ide

2.每次系統更新樣式時,應用會調用當前全部存在的元素調用對應的一些從新方法,進行重繪視圖,能夠在對應的方法作相應的改動ui

資源文件適配

1.建立一個Assets文件(或在現有的Assets文件中) 2.新建一個圖片資源文件(或者顏色資源文件、或者其餘資源文件) 3.選中該資源文件, 打開 Xcode ->View ->Inspectors ->Show Attributes Inspectors (或者Option+Command+4)視圖,將Apperances 選項 改成Any,Dark 4.執行完第三步,資源文件將會有多個容器框,分別爲 Any Apperance 和 Dark Apperance. Any Apperance 應用於默認狀況(Unspecified)與高亮狀況(Light), Dark Apperance 應用於暗黑模式(Dark) 5.代碼默認執行時,就能夠正常經過名字使用了,系統會根據當前模式自動獲取對應的資源文件spa

注意code

同一工程內多個Assets文件在打包後,就會生成一個Assets.car 文件,因此要保證Assets內資源文件的名字不能相同orm

UIView

traitCollectionDidChange(_:)
layoutSubviews()
draw(_:)
updateConstraints()
tintColorDidChange()
複製代碼

UIViewController

traitCollectionDidChange(_:)
updateViewConstraints()
viewWillLayoutSubviews()
viewDidLayoutSubviews()
複製代碼

UIPresentationController

traitCollectionDidChange(_:)
containerViewWillLayoutSubviews()
containerViewDidLayoutSubviews()
複製代碼

全局關閉黑暗模式

  • 方式一 配置plist文件: 在Info.plist 文件中,添加UIUserInterfaceStyle key 名字爲 User Interface Style 值爲String,將UIUserInterfaceStyle key 的值設置爲 Light

在開發中,若是用的系統控件(如cell、tableview的背景色)未設置背景色(或者爲透明),則進入暗黑模式後,控件背景色變爲黑色。

能夠每個頁面設置,固然也能夠總體設置, 通常咱們的APP都是在一個window下的,那就總體設置APP裏的window

  • 方式二 :代碼關閉黑暗模式 強制關閉暗黑模式
#if defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
if(@available(iOS 13.0,*)){
self.window.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
}
#endif
複製代碼

單個界面不遵循暗黑模式

  1. UIViewController與UIView 都新增一個屬性 overrideUserInterfaceStyle

  2. 將 overrideUserInterfaceStyle 設置爲對應的模式,則強制限制該元素與其子元素以設置的模式進行展現,不跟隨系統模式改變進行改變

    1. 設置 ViewController 的該屬性, 將會影響視圖控制器的視圖和子視圖控制器採用該樣式
    2. 設置 View 的該屬性, 將會影響視圖及其全部子視圖採用該樣式
    3. 設置 Window 的該屬性, 將會影響窗口中的全部內容都採用樣式,包括根視圖控制器和在該窗口中顯示內容的全部演示控制器(UIPresentationController)

iOS適配暗黑模式:www.jianshu.com/p/7925bd51d…

5.增長一直使用藍牙的權限申請

CBCentralManager,iOS13之前,使用藍牙時能夠直接用,不會出現權限提示,iOS13後,再使用就會提示了。 在info.plist裏增長

<key>NSBluetoothAlwaysUsageDescription</key> 
<string>咱們要一直使用您的藍牙,具體作什麼別問我</string>`
複製代碼

6.使用MJExtension 中處理NSNull的不一樣

這個直接會致使Crash的在將服務端數據字典轉換爲模型時,若是遇到服務端給的數據爲NSNull時, mj_JSONObject,其中 class_copyPropertyList方法獲得的屬性裏,多了一種EFSQLBinding類型的東西,並且屬性數量也不許確, 那就沒辦法了, 我只能改寫這個方法了,這個組件沒有更新的狀況下,寫了一個方法swizzling掉把當遇到 NSNull時,直接轉爲nil了。

7. WKWebView 中測量頁面內容高度的方式變動

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

8. 友盟消息推送,獲取deviceToken適配

- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
   if (![deviceToken isKindOfClass:[NSData class]]) return;
      const unsigned *tokenBytes = (const unsigned *)[deviceToken bytes];
      NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),ntohl(tokenBytes[6]),ntohl(tokenBytes[7])];
      pushDeviceToken = hexToken;
      NSLog(@"deviceToken:%@",hexToken);
}
複製代碼

9. StatusBar 與以前版本不一樣

目前狀態欄也增長了一種模式,由以前的兩種,變成了三種, 其中default由以前的黑色內容,變成了會根據系統模式,自動選擇當前展現lightContent仍是darkContent

10. fishhook 致使的Crash (github.com/facebook/fi…

相關文章
相關標籤/搜索