From 1cf7f7ca43c5de8bc526b7af7aa718b1178fb8b4 Mon Sep 17 00:00:00 2001 From: Felix Lisczyk Date: Fri, 1 Sep 2023 11:45:44 +0200 Subject: [PATCH 1/2] Adopted trait registration API and fixed iOS 17 crash --- .../Onboarding/UIOnboardingViewController.swift | 16 ++++++++++++++++ .../Onboarding/Views/UIOnboardingCell.swift | 16 ++++++++++++++++ .../UIOnboardingViewController.swift | 16 ++++++++++++++++ .../UIOnboarding/Views/UIOnboardingCell.swift | 16 ++++++++++++++++ 4 files changed, 64 insertions(+) diff --git a/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/UIOnboardingViewController.swift b/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/UIOnboardingViewController.swift index 530d697..eac223b 100644 --- a/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/UIOnboardingViewController.swift +++ b/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/UIOnboardingViewController.swift @@ -52,6 +52,12 @@ final class UIOnboardingViewController: UIViewController { self.screen = screen super.init(nibName: nil, bundle: nil) modalPresentationStyle = .fullScreen + + if #available(iOS 17.0, *) { + registerForTraitChanges([UITraitHorizontalSizeClass.self]) { (self: Self, _) in + self.handleHorizontalSizeClassChange() + } + } } required init?(coder: NSCoder) { @@ -91,6 +97,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..5d53e44 100644 --- a/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Views/UIOnboardingCell.swift +++ b/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Views/UIOnboardingCell.swift @@ -56,6 +56,12 @@ final class UIOnboardingCell: UITableViewCell { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) + + if #available(iOS 17.0, *) { + registerForTraitChanges([UITraitHorizontalSizeClass.self]) { (self: Self, _) in + self.handleHorizontalSizeClassChange() + } + } } required init?(coder: NSCoder) { @@ -113,6 +119,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..562a451 100644 --- a/Sources/UIOnboarding/UIOnboardingViewController.swift +++ b/Sources/UIOnboarding/UIOnboardingViewController.swift @@ -52,6 +52,12 @@ public final class UIOnboardingViewController: UIViewController { self.screen = screen super.init(nibName: nil, bundle: nil) modalPresentationStyle = .fullScreen + + if #available(iOS 17.0, *) { + registerForTraitChanges([UITraitHorizontalSizeClass.self]) { (self: Self, _) in + self.handleHorizontalSizeClassChange() + } + } } required init?(coder: NSCoder) { @@ -91,6 +97,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..b9858f6 100644 --- a/Sources/UIOnboarding/Views/UIOnboardingCell.swift +++ b/Sources/UIOnboarding/Views/UIOnboardingCell.swift @@ -56,6 +56,12 @@ final class UIOnboardingCell: UITableViewCell { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) + + if #available(iOS 17.0, *) { + registerForTraitChanges([UITraitHorizontalSizeClass.self]) { (self: Self, _) in + self.handleHorizontalSizeClassChange() + } + } } required init?(coder: NSCoder) { @@ -113,6 +119,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 From f402e7e2f3568385e275439d50eb840b54fa7efb Mon Sep 17 00:00:00 2001 From: Felix Lisczyk Date: Fri, 1 Sep 2023 13:19:37 +0200 Subject: [PATCH 2/2] Fixed compilation on Xcode 14 --- .../Onboarding/UIOnboardingViewController.swift | 10 ++++++---- .../Onboarding/Views/UIOnboardingCell.swift | 10 ++++++---- Sources/UIOnboarding/UIOnboardingViewController.swift | 10 ++++++---- Sources/UIOnboarding/Views/UIOnboardingCell.swift | 10 ++++++---- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/UIOnboardingViewController.swift b/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/UIOnboardingViewController.swift index eac223b..cb2ad6f 100644 --- a/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/UIOnboardingViewController.swift +++ b/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/UIOnboardingViewController.swift @@ -53,11 +53,13 @@ final class UIOnboardingViewController: UIViewController { super.init(nibName: nil, bundle: nil) modalPresentationStyle = .fullScreen - if #available(iOS 17.0, *) { - registerForTraitChanges([UITraitHorizontalSizeClass.self]) { (self: Self, _) in - self.handleHorizontalSizeClassChange() + #if swift(>=5.9) + if #available(iOS 17.0, *) { + registerForTraitChanges([UITraitHorizontalSizeClass.self]) { (self: Self, _) in + self.handleHorizontalSizeClassChange() + } } - } + #endif } required init?(coder: NSCoder) { diff --git a/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Views/UIOnboardingCell.swift b/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Views/UIOnboardingCell.swift index 5d53e44..33453c3 100644 --- a/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Views/UIOnboardingCell.swift +++ b/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Views/UIOnboardingCell.swift @@ -57,11 +57,13 @@ final class UIOnboardingCell: UITableViewCell { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) - if #available(iOS 17.0, *) { - registerForTraitChanges([UITraitHorizontalSizeClass.self]) { (self: Self, _) in - self.handleHorizontalSizeClassChange() + #if swift(>=5.9) + if #available(iOS 17.0, *) { + registerForTraitChanges([UITraitHorizontalSizeClass.self]) { (self: Self, _) in + self.handleHorizontalSizeClassChange() + } } - } + #endif } required init?(coder: NSCoder) { diff --git a/Sources/UIOnboarding/UIOnboardingViewController.swift b/Sources/UIOnboarding/UIOnboardingViewController.swift index 562a451..952dd04 100644 --- a/Sources/UIOnboarding/UIOnboardingViewController.swift +++ b/Sources/UIOnboarding/UIOnboardingViewController.swift @@ -53,11 +53,13 @@ public final class UIOnboardingViewController: UIViewController { super.init(nibName: nil, bundle: nil) modalPresentationStyle = .fullScreen - if #available(iOS 17.0, *) { - registerForTraitChanges([UITraitHorizontalSizeClass.self]) { (self: Self, _) in - self.handleHorizontalSizeClassChange() + #if swift(>=5.9) + if #available(iOS 17.0, *) { + registerForTraitChanges([UITraitHorizontalSizeClass.self]) { (self: Self, _) in + self.handleHorizontalSizeClassChange() + } } - } + #endif } required init?(coder: NSCoder) { diff --git a/Sources/UIOnboarding/Views/UIOnboardingCell.swift b/Sources/UIOnboarding/Views/UIOnboardingCell.swift index b9858f6..1bb6866 100644 --- a/Sources/UIOnboarding/Views/UIOnboardingCell.swift +++ b/Sources/UIOnboarding/Views/UIOnboardingCell.swift @@ -57,11 +57,13 @@ final class UIOnboardingCell: UITableViewCell { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) - if #available(iOS 17.0, *) { - registerForTraitChanges([UITraitHorizontalSizeClass.self]) { (self: Self, _) in - self.handleHorizontalSizeClassChange() + #if swift(>=5.9) + if #available(iOS 17.0, *) { + registerForTraitChanges([UITraitHorizontalSizeClass.self]) { (self: Self, _) in + self.handleHorizontalSizeClassChange() + } } - } + #endif } required init?(coder: NSCoder) {