Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kylehughes/da50c004ffa058645b4e64e832a9e3dd to your computer and use it in GitHub Desktop.
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.
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