// // AdaptiveMarginStatusTableViewCell.swift // // // Created by MainasuK on 2022-2-18. // import UIKit public protocol AdaptiveContainerView: UIView { func updateContainerViewComponentsLayoutMarginsRelativeArrangementBehavior(isEnabled: Bool) } public protocol AdaptiveContainerMarginTableViewCell: UITableViewCell { associatedtype ContainerView: AdaptiveContainerView static var containerViewMarginForRegularHorizontalSizeClass: CGFloat { get } var containerView: ContainerView { get } var containerViewLeadingLayoutConstraint: NSLayoutConstraint! { get set } var containerViewTrailingLayoutConstraint: NSLayoutConstraint! { get set } } extension AdaptiveContainerMarginTableViewCell { public static var containerViewMarginForRegularHorizontalSizeClass: CGFloat { 64 } public func setupContainerViewMarginConstraints() { containerViewLeadingLayoutConstraint = containerView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor) containerViewTrailingLayoutConstraint = contentView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor) } public func updateContainerViewMarginConstraints() { func setupContainerForPhone() { containerView.updateContainerViewComponentsLayoutMarginsRelativeArrangementBehavior(isEnabled: true) // add inner margin for phone containerViewLeadingLayoutConstraint.constant = 0 // remove outer margin for phone containerViewTrailingLayoutConstraint.constant = 0 } switch traitCollection.userInterfaceIdiom { case .phone: setupContainerForPhone() default: guard traitCollection.horizontalSizeClass == .regular else { setupContainerForPhone() return } containerView.updateContainerViewComponentsLayoutMarginsRelativeArrangementBehavior(isEnabled: false) // remove margin for iPad containerViewLeadingLayoutConstraint.constant = Self.containerViewMarginForRegularHorizontalSizeClass // add outer margin for iPad containerViewTrailingLayoutConstraint.constant = Self.containerViewMarginForRegularHorizontalSizeClass } } public var containerViewHorizontalMargin: CGFloat { containerViewLeadingLayoutConstraint.constant + containerViewTrailingLayoutConstraint.constant } }