From efd1e944c399de24c10d9f4947301e1c105dbb9b Mon Sep 17 00:00:00 2001 From: Felix Lisczyk Date: Tue, 12 Sep 2023 08:18:28 +0200 Subject: [PATCH] Adopt trait registration API (#19) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Adopt trait registration API. • Fix iOS 17 crash. • Fix compilation on Xcode 14. --- .../UIOnboardingViewController.swift | 18 ++++++++++++++++++ .../Onboarding/Views/UIOnboardingCell.swift | 18 ++++++++++++++++++ .../UIOnboardingViewController.swift | 18 ++++++++++++++++++ .../UIOnboarding/Views/UIOnboardingCell.swift | 18 ++++++++++++++++++ 4 files changed, 72 insertions(+) diff --git a/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/UIOnboardingViewController.swift b/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/UIOnboardingViewController.swift index 530d697..cb2ad6f 100644 --- a/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/UIOnboardingViewController.swift +++ b/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/UIOnboardingViewController.swift @@ -52,6 +52,14 @@ final class UIOnboardingViewController: UIViewController { self.screen = screen super.init(nibName: nil, bundle: nil) modalPresentationStyle = .fullScreen + + #if swift(>=5.9) + if #available(iOS 17.0, *) { + registerForTraitChanges([UITraitHorizontalSizeClass.self]) { (self: Self, _) in + self.handleHorizontalSizeClassChange() + } + } + #endif } required init?(coder: NSCoder) { @@ -91,6 +99,16 @@ final class UIOnboardingViewController: UIViewController { } override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + if #unavailable(iOS 17.0), traitCollection.horizontalSizeClass != previousTraitCollection?.horizontalSizeClass { + // iOS 17+ uses the trait registration API instead. (`registerForTraitChanges(_:handler:)`) + handleHorizontalSizeClassChange() + } + } + + private func handleHorizontalSizeClassChange() { + // Check if the view is visible and the properties are initialized. + guard viewIfLoaded?.window != nil else { return } + onboardingStackView.onboardingTitleLabelStack.configureFont(traitCollection.horizontalSizeClass == .regular ? 80 : (UIScreenType.isiPhoneSE || UIScreenType.isiPhone6s ? 41 : 44)) continueButtonHeight.constant = UIFontMetrics.default.scaledValue(for: traitCollection.horizontalSizeClass == .regular ? 50 : (UIScreenType.isiPhoneSE ? 48 : 52)) diff --git a/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Views/UIOnboardingCell.swift b/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Views/UIOnboardingCell.swift index f0038cc..33453c3 100644 --- a/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Views/UIOnboardingCell.swift +++ b/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Views/UIOnboardingCell.swift @@ -56,6 +56,14 @@ final class UIOnboardingCell: UITableViewCell { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) + + #if swift(>=5.9) + if #available(iOS 17.0, *) { + registerForTraitChanges([UITraitHorizontalSizeClass.self]) { (self: Self, _) in + self.handleHorizontalSizeClassChange() + } + } + #endif } required init?(coder: NSCoder) { @@ -113,6 +121,16 @@ final class UIOnboardingCell: UITableViewCell { } override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + if #unavailable(iOS 17.0), traitCollection.horizontalSizeClass != previousTraitCollection?.horizontalSizeClass { + // iOS 17+ uses the trait registration API instead. (`registerForTraitChanges(_:handler:)`) + handleHorizontalSizeClassChange() + } + } + + private func handleHorizontalSizeClassChange() { + // Check if the view is visible and the properties are initialized. + guard window != nil else { return } + configureFonts() stackBottom.constant = traitCollection.horizontalSizeClass == .regular ? -48 : -12 diff --git a/Sources/UIOnboarding/UIOnboardingViewController.swift b/Sources/UIOnboarding/UIOnboardingViewController.swift index cc47527..952dd04 100644 --- a/Sources/UIOnboarding/UIOnboardingViewController.swift +++ b/Sources/UIOnboarding/UIOnboardingViewController.swift @@ -52,6 +52,14 @@ public final class UIOnboardingViewController: UIViewController { self.screen = screen super.init(nibName: nil, bundle: nil) modalPresentationStyle = .fullScreen + + #if swift(>=5.9) + if #available(iOS 17.0, *) { + registerForTraitChanges([UITraitHorizontalSizeClass.self]) { (self: Self, _) in + self.handleHorizontalSizeClassChange() + } + } + #endif } required init?(coder: NSCoder) { @@ -91,6 +99,16 @@ public final class UIOnboardingViewController: UIViewController { } public override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + if #unavailable(iOS 17.0), traitCollection.horizontalSizeClass != previousTraitCollection?.horizontalSizeClass { + // iOS 17+ uses the trait registration API instead. (`registerForTraitChanges(_:handler:)`) + handleHorizontalSizeClassChange() + } + } + + private func handleHorizontalSizeClassChange() { + // Check if the view is visible and the properties are initialized. + guard viewIfLoaded?.window != nil else { return } + onboardingStackView.onboardingTitleLabelStack.configureFont(traitCollection.horizontalSizeClass == .regular ? 80 : (UIScreenType.isiPhoneSE || UIScreenType.isiPhone6s ? 41 : 44)) continueButtonHeight.constant = UIFontMetrics.default.scaledValue(for: traitCollection.horizontalSizeClass == .regular ? 50 : (UIScreenType.isiPhoneSE ? 48 : 52)) diff --git a/Sources/UIOnboarding/Views/UIOnboardingCell.swift b/Sources/UIOnboarding/Views/UIOnboardingCell.swift index e568b07..1bb6866 100644 --- a/Sources/UIOnboarding/Views/UIOnboardingCell.swift +++ b/Sources/UIOnboarding/Views/UIOnboardingCell.swift @@ -56,6 +56,14 @@ final class UIOnboardingCell: UITableViewCell { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) + + #if swift(>=5.9) + if #available(iOS 17.0, *) { + registerForTraitChanges([UITraitHorizontalSizeClass.self]) { (self: Self, _) in + self.handleHorizontalSizeClassChange() + } + } + #endif } required init?(coder: NSCoder) { @@ -113,6 +121,16 @@ final class UIOnboardingCell: UITableViewCell { } override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + if #unavailable(iOS 17.0), traitCollection.horizontalSizeClass != previousTraitCollection?.horizontalSizeClass { + // iOS 17+ uses the trait registration API instead. (`registerForTraitChanges(_:handler:)`) + handleHorizontalSizeClassChange() + } + } + + private func handleHorizontalSizeClassChange() { + // Check if the view is visible and the properties are initialized. + guard window != nil else { return } + configureFonts() stackBottom.constant = traitCollection.horizontalSizeClass == .regular ? -48 : -12