|
1 | 1 | import UIKit |
2 | 2 |
|
3 | | -#if os(iOS) |
| 3 | +#if os(iOS) || targetEnvironment(macCatalyst) |
4 | 4 | final class SplitWidget: WrapperControllerWidget<UISplitViewController>, |
5 | 5 | UISplitViewControllerDelegate |
6 | 6 | { |
7 | | - var resizeHandler: (() -> Void)? |
8 | | - private let sidebarContainer: ContainerWidget |
9 | | - private let mainContainer: ContainerWidget |
| 7 | + private final class ColumnView: UIView { |
| 8 | + unowned var splitWidget: SplitWidget! |
| 9 | + |
| 10 | + @available(*, unavailable) |
| 11 | + required init?(coder: NSCoder) { |
| 12 | + fatalError("init(coder:) is not used for this view") |
| 13 | + } |
| 14 | + |
| 15 | + init() { |
| 16 | + super.init(frame: .zero) |
| 17 | + } |
| 18 | + |
| 19 | + override func layoutSubviews() { |
| 20 | + super.layoutSubviews() |
| 21 | + if !splitWidget.hasCalledResizeHandler { |
| 22 | + splitWidget.resizeHandler?() |
| 23 | + splitWidget.hasCalledResizeHandler = true |
| 24 | + } |
| 25 | + } |
| 26 | + } |
| 27 | + |
| 28 | + private final class ColumnWidget: ContainerWidget { |
| 29 | + let columnView = ColumnView() |
| 30 | + |
| 31 | + override func loadView() { |
| 32 | + view = columnView |
| 33 | + } |
| 34 | + } |
| 35 | + |
| 36 | + var resizeHandler: (() -> Void)? { |
| 37 | + didSet { |
| 38 | + hasCalledResizeHandler = false |
| 39 | + } |
| 40 | + } |
| 41 | + |
| 42 | + // This is just a flag so that we don't call resizeHandler twice in one pass through the run loop. |
| 43 | + var hasCalledResizeHandler = false { |
| 44 | + willSet { |
| 45 | + if newValue { |
| 46 | + DispatchQueue.main.async { [weak self] in |
| 47 | + self?.hasCalledResizeHandler = false |
| 48 | + } |
| 49 | + } |
| 50 | + } |
| 51 | + } |
| 52 | + |
| 53 | + private let sidebarContainer: ColumnWidget |
| 54 | + private let mainContainer: ColumnWidget |
10 | 55 |
|
11 | 56 | init(sidebarWidget: some WidgetProtocol, mainWidget: some WidgetProtocol) { |
12 | 57 | // UISplitViewController requires its children to be controllers, not views |
13 | | - sidebarContainer = ContainerWidget(child: sidebarWidget) |
14 | | - mainContainer = ContainerWidget(child: mainWidget) |
| 58 | + sidebarContainer = ColumnWidget(child: sidebarWidget) |
| 59 | + mainContainer = ColumnWidget(child: mainWidget) |
15 | 60 |
|
16 | 61 | super.init(child: UISplitViewController()) |
17 | 62 |
|
| 63 | + sidebarContainer.parentWidget = self |
| 64 | + mainContainer.parentWidget = self |
| 65 | + childWidgets = [sidebarContainer, mainContainer] |
| 66 | + sidebarContainer.columnView.splitWidget = self |
| 67 | + mainContainer.columnView.splitWidget = self |
| 68 | + |
18 | 69 | child.delegate = self |
19 | 70 |
|
20 | 71 | child.preferredDisplayMode = .oneBesideSecondary |
@@ -45,11 +96,6 @@ import UIKit |
45 | 96 |
|
46 | 97 | super.viewDidLoad() |
47 | 98 | } |
48 | | - |
49 | | - override func viewDidLayoutSubviews() { |
50 | | - super.viewDidLayoutSubviews() |
51 | | - resizeHandler?() |
52 | | - } |
53 | 99 | } |
54 | 100 |
|
55 | 101 | extension UIKitBackend { |
|
0 commit comments