Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .github/workflows/build-test-and-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -165,8 +165,7 @@ jobs:
buildtarget PathsExample
buildtarget ControlsExample
buildtarget RandomNumberGeneratorExample
# TODO test whether this works on Catalyst
# buildtarget SplitExample
buildtarget SplitExample

windows:
runs-on: windows-latest
Expand Down
4 changes: 4 additions & 0 deletions Examples/Bundler.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ identifier = 'dev.swiftcrossui.SplitExample'
product = 'SplitExample'
version = '0.1.0'

[[apps.SplitExample.overlays]]
condition = "platform(macCatalyst)"
interface_idiom = "mac"

[apps.SpreadsheetExample]
identifier = 'dev.swiftcrossui.SpreadsheetExample'
product = 'SpreadsheetExample'
Expand Down
45 changes: 35 additions & 10 deletions Sources/UIKitBackend/UIKitBackend+SplitView.swift
Original file line number Diff line number Diff line change
@@ -1,20 +1,50 @@
import UIKit

#if os(iOS)
#if os(iOS) || targetEnvironment(macCatalyst)
final class SplitWidget: WrapperControllerWidget<UISplitViewController>,
UISplitViewControllerDelegate
{
private final class ColumnView: UIView {
unowned var splitWidget: SplitWidget!

@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) is not used for this view")
}

init() {
super.init(frame: .zero)
}

override func layoutSubviews() {
super.layoutSubviews()
splitWidget.resizeHandler?()
}
}

private final class ColumnWidget: ContainerWidget {
override func loadView() {
view = ColumnView()
}
}

var resizeHandler: (() -> Void)?
private let sidebarContainer: ContainerWidget
private let mainContainer: ContainerWidget
private let sidebarContainer: ColumnWidget
private let mainContainer: ColumnWidget

init(sidebarWidget: some WidgetProtocol, mainWidget: some WidgetProtocol) {
// UISplitViewController requires its children to be controllers, not views
sidebarContainer = ContainerWidget(child: sidebarWidget)
mainContainer = ContainerWidget(child: mainWidget)
sidebarContainer = ColumnWidget(child: sidebarWidget)
mainContainer = ColumnWidget(child: mainWidget)

super.init(child: UISplitViewController())

sidebarContainer.parentWidget = self
mainContainer.parentWidget = self
childWidgets = [sidebarContainer, mainContainer]
(sidebarContainer.view as! ColumnView).splitWidget = self
(mainContainer.view as! ColumnView).splitWidget = self

child.delegate = self

child.preferredDisplayMode = .oneBesideSecondary
Expand Down Expand Up @@ -45,11 +75,6 @@ import UIKit

super.viewDidLoad()
}

override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
resizeHandler?()
}
}

extension UIKitBackend {
Expand Down
Loading