Created
November 30, 2022 04:45
-
-
Save kylehughes/da50c004ffa058645b4e64e832a9e3dd to your computer and use it in GitHub Desktop.
View controller that can override the content size category of a single child via the standard size change edit actions.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
public final class StandardSizeChangeViaTraitCollectionViewController<Base>: | |
UIViewController | |
where | |
Base: UIViewController | |
{ | |
public let base: Base | |
// MARK: Public Initialization | |
public init(_ base: Base) { | |
self.base = base | |
super.init(nibName: nil, bundle: nil) | |
} | |
required init?(coder: NSCoder) { | |
fatalError("init(coder:) has not been implemented") | |
} | |
// MARK: UIViewController Implementation | |
override public func viewDidLoad() { | |
super.viewDidLoad() | |
base.view.autoresizingMask = [.flexibleHeight, .flexibleWidth] | |
addChild(base) | |
view.addSubview(base.view) | |
base.view.frame = view.bounds | |
base.didMove(toParent: self) | |
} | |
// MARK: UIResponderStandardEditActions Implementation | |
override public func decreaseSize(_ sender: Any?) { | |
setOverrideTraitCollection( | |
UITraitCollection(preferredContentSizeCategory: base.traitCollection.preferredContentSizeCategory.previous), | |
forChild: base | |
) | |
} | |
override public func increaseSize(_ sender: Any?) { | |
setOverrideTraitCollection( | |
UITraitCollection(preferredContentSizeCategory: base.traitCollection.preferredContentSizeCategory.next), | |
forChild: base | |
) | |
} | |
} | |
// MARK: - Extension for UIContentSizeCategory | |
extension UIContentSizeCategory { | |
// MARK: Internal Instance Interface | |
var next: UIContentSizeCategory { | |
switch self { | |
case .extraSmall: | |
return .small | |
case .small: | |
return .medium | |
case .medium: | |
return .large | |
case .large: | |
return .extraLarge | |
case .extraLarge: | |
return .extraExtraLarge | |
case .extraExtraLarge: | |
return .extraExtraExtraLarge | |
case .extraExtraExtraLarge: | |
return .accessibilityMedium | |
case .accessibilityMedium: | |
return .accessibilityLarge | |
case .accessibilityLarge: | |
return .accessibilityExtraLarge | |
case .accessibilityExtraLarge: | |
return .accessibilityExtraExtraLarge | |
case .accessibilityExtraExtraLarge: | |
return .accessibilityExtraExtraExtraLarge | |
case .accessibilityExtraExtraExtraLarge: | |
return self | |
case .unspecified: | |
return self | |
default: | |
return self | |
} | |
} | |
var previous: UIContentSizeCategory { | |
switch self { | |
case .extraSmall: | |
return self | |
case .small: | |
return .extraSmall | |
case .medium: | |
return .small | |
case .large: | |
return .medium | |
case .extraLarge: | |
return .large | |
case .extraExtraLarge: | |
return .extraLarge | |
case .extraExtraExtraLarge: | |
return .extraExtraLarge | |
case .accessibilityMedium: | |
return .extraExtraExtraLarge | |
case .accessibilityLarge: | |
return .accessibilityMedium | |
case .accessibilityExtraLarge: | |
return .accessibilityLarge | |
case .accessibilityExtraExtraLarge: | |
return .accessibilityExtraLarge | |
case .accessibilityExtraExtraExtraLarge: | |
return .accessibilityExtraExtraLarge | |
case .unspecified: | |
return self | |
default: | |
return self | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment