1、日夜間切換
// 該方法已被銷毀在17及以后
func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)
使用如下方法替換:
override func viewDidLoad() {
super.viewDidLoad()
// 二者擇其一即可
if #available(iOS 17.0, *) {
registerForTraitChanges(
[UITraitUserInterfaceStyle.self],
target: self,
action: #selector(traitConfigureView)
)
registerForTraitChanges(
[UITraitUserInterfaceStyle.self],
handler: { (self: Self, _: UITraitCollection) in
if self.traitCollection.userInterfaceStyle == .light {
print("App switched to light mode")
} else {
print("App switched to dark mode")
}
print("=====registerForTraitChanges")
}
)
}
}
@objc private func traitConfigureView() {
print("=====registerForTraitChanges")
}
2半醉、UIViewController
增加了新的屬性contentUnavailableConfiguration躲庄,用于設置view內容不可達時的占位內容。
增加了新的生命周期函數viewIsAppearing()洁桌,調用時機介于viewWillAppear()與viewDidAppear()之間媚朦,并且兼容到 iOS 13氧敢。
import UIKit
class ViewController: UIViewController {
// UIContentUnavailableConfiguration
lazy var emptyConfig: UIContentUnavailableConfiguration = {
var config = UIContentUnavailableConfiguration.empty()
config.text = "暫無數據"
config.image = UIImage(systemName: "exclamationmark.triangle")
return config
}()
// MARK: view完成內存加載
override func viewDidLoad() {
super.viewDidLoad()
print(#function)
}
// MARK: view即將顯示
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print(#function)
}
// MARK: view已經顯示,iOS17新增
override func viewIsAppearing(_ animated: Bool) {
super.viewIsAppearing(animated)
contentUnavailableConfiguration = emptyConfig
// 切換UIContentUnavailableConfiguration
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
let loadingConfig = UIContentUnavailableConfiguration.loading()
self.contentUnavailableConfiguration = loadingConfig
}
// 移除UIContentUnavailableConfiguration
DispatchQueue.main.asyncAfter(deadline: .now() + 6) {
self.contentUnavailableConfiguration = nil
self.view.backgroundColor = .systemTeal
}
print(#function)
}
// MARK: view即將布局子UIView
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
print(#function)
}
// MARK: view完成布局子UIView
override func viewDidLayoutSubviews() {
super.viewWillLayoutSubviews()
print(#function)
}
// MARK: view完全顯示
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print(#function)
}
// MARK: view即將消失
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print(#function)
}
// MARK: view徹底消失
override func viewDidDisappear(_ animated: Bool) {
super.viewDidAppear(animated)
print(#function)
}
}
#Preview {
ViewController()
}