[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
會出現這種狀況是主要是由於咱們以前對UIViewController裏面的一個屬性,即modalPresentationStyle(該屬性是控制器在模態視圖時將要使用的樣式)沒有設置須要的類型。在iOS13中modalPresentationStyle的默認改成UIModalPresentationAutomatic,而在以前默認是UIModalPresentationFullScreen。github
這個不受Xcode版本的影響,只要是iOS13的系統,沒有顯式設置modalPresentationStyle,就會有這個問題面試
從 iOS 8 的時候,蘋果就引入了 LaunchScreen,咱們能夠設置 LaunchScreen來做爲啓動頁。固然,如今你還可使用LaunchImage來設置啓動圖。不過使用LaunchImage的話,要求咱們必須提供各類屏幕尺寸的啓動圖,來適配各類設備,隨着蘋果設備尺寸愈來愈多,這種方式顯然不夠 Flexible。而使用 LaunchScreen的話,狀況會變的很簡單, LaunchScreen是支持AutoLayout+SizeClass的,因此適配各類屏幕都不在話下。 注意啦⚠️,從2020年4月開始,全部使⽤ iOS13 SDK 的 App 將必須提供 LaunchScreen,LaunchImage即將退出歷史舞臺算法
原理swift
1.將同一個資源,建立出兩種模式的樣式。系統根據當前選擇的樣式,自動獲取該樣式的資源瀏覽器
2.每次系統更新樣式時,應用會調用當前全部存在的元素調用對應的一些從新方法,進行重繪視圖,能夠在對應的方法作相應的改動數據結構
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.代碼默認執行時,就能夠正常經過名字使用了,系統會根據當前模式自動獲取對應的資源文件app
注意ide
同一工程內多個Assets文件在打包後,就會生成一個Assets.car 文件,因此要保證Assets內資源文件的名字不能相同post
UIView
traitCollectionDidChange(_:) layoutSubviews() draw(_:) updateConstraints() tintColorDidChange()
UIViewController
traitCollectionDidChange(_:) updateViewConstraints() viewWillLayoutSubviews() viewDidLayoutSubviews()
UIPresentationController
traitCollectionDidChange(_:) containerViewWillLayoutSubviews() containerViewDidLayoutSubviews()
在開發中,若是用的系統控件(如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
將 overrideUserInterfaceStyle 設置爲對應的模式,則強制限制該元素與其子元素以設置的模式進行展現,不跟隨系統模式改變進行改變
- 設置 ViewController 的該屬性, 將會影響視圖控制器的視圖和子視圖控制器採用該樣式
- 設置 View 的該屬性, 將會影響視圖及其全部子視圖採用該樣式
- 設置 Window 的該屬性, 將會影響窗口中的全部內容都採用樣式,包括根視圖控制器和在該窗口中顯示內容的全部演示控制器(UIPresentationController)
iOS適配暗黑模式:www.jianshu.com/p/7925bd51d…
CBCentralManager,iOS13之前,使用藍牙時能夠直接用,不會出現權限提示,iOS13後,再使用就會提示了。 在info.plist裏增長
<key>NSBluetoothAlwaysUsageDescription</key> <string>咱們要一直使用您的藍牙,具體作什麼別問我</string>`
這個直接會致使Crash的在將服務端數據字典轉換爲模型時,若是遇到服務端給的數據爲NSNull時, mj_JSONObject,其中 class_copyPropertyList方法獲得的屬性裏,多了一種EFSQLBinding類型的東西,並且屬性數量也不許確, 那就沒辦法了, 我只能改寫這個方法了,這個組件沒有更新的狀況下,寫了一個方法swizzling掉把當遇到 NSNull時,直接轉爲nil了。
iOS 13之前 document.body.scrollHeight iOS 13中 document.documentElement.scrollHeight 二者相差55 應該是瀏覽器定義高度變了
- (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); }
目前狀態欄也增長了一種模式,由以前的兩種,變成了三種, 其中default由以前的黑色內容,變成了會根據系統模式,自動選擇當前展現lightContent仍是darkContent
給你們推薦一個iOS技術交流羣,羣內提供數據結構與算法、底層進階、swift、逆向、底層面試題整合文檔等免費資料!!!能夠直接加入羣聊【iOS開發交流學習羣】
收錄:原文地址