[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即將退出歷史舞臺bash
原理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()
複製代碼
在開發中,若是用的系統控件(如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
複製代碼
UIViewController與UIView 都新增一個屬性 overrideUserInterfaceStyle
將 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