Changed the main example selection screen to use a UITableView (to more easily add or remove examples) wrapped in a UISplitViewController so it will layout well on iPads also

This commit is contained in:
Zachary Duncan
2022-04-20 11:00:42 -04:00
committed by Zachary Duncan
parent 8060d387b0
commit 9d703e9867
5 changed files with 287 additions and 85 deletions

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View File

@@ -48,6 +48,8 @@
C324DB5B2807216B0060589F /* RiveSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C324DB5A2807216B0060589F /* RiveSlider.swift */; };
C324DB5D280728690060589F /* RiveButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = C324DB5C280728690060589F /* RiveButton.swift */; };
C324DB5F280740FB0060589F /* rbutton.riv in Resources */ = {isa = PBXBuildFile; fileRef = C324DB5E280740FB0060589F /* rbutton.riv */; };
C3357CA1280F42EC00F03B6F /* ExamplesMaster.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3357CA0280F42EC00F03B6F /* ExamplesMaster.swift */; };
C3357CA5280F430000F03B6F /* ExamplesDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3357CA4280F430000F03B6F /* ExamplesDetail.swift */; };
C3460A002800A6CE002DBCB7 /* bird.riv in Resources */ = {isa = PBXBuildFile; fileRef = C34609FD2800A6CE002DBCB7 /* bird.riv */; };
C3468E6227FDCBC6008652FD /* SimpleSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3468E6127FDCBC6008652FD /* SimpleSlider.swift */; };
C3D187F3280751A8008B739A /* RiveProgressBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D187F2280751A8008B739A /* RiveProgressBar.swift */; };
@@ -141,6 +143,8 @@
C324DB5A2807216B0060589F /* RiveSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RiveSlider.swift; sourceTree = "<group>"; };
C324DB5C280728690060589F /* RiveButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RiveButton.swift; sourceTree = "<group>"; };
C324DB5E280740FB0060589F /* rbutton.riv */ = {isa = PBXFileReference; lastKnownFileType = file; path = rbutton.riv; sourceTree = "<group>"; };
C3357CA0280F42EC00F03B6F /* ExamplesMaster.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExamplesMaster.swift; sourceTree = "<group>"; };
C3357CA4280F430000F03B6F /* ExamplesDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExamplesDetail.swift; sourceTree = "<group>"; };
C34609FD2800A6CE002DBCB7 /* bird.riv */ = {isa = PBXFileReference; lastKnownFileType = file; path = bird.riv; sourceTree = "<group>"; };
C3468E6127FDCBC6008652FD /* SimpleSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimpleSlider.swift; sourceTree = "<group>"; };
C3D187F2280751A8008B739A /* RiveProgressBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RiveProgressBar.swift; sourceTree = "<group>"; };
@@ -294,16 +298,18 @@
C9C73E9624FC471E00EF9516 /* Source */ = {
isa = PBXGroup;
children = (
04A8F6C226452F25002C909A /* lib */,
C324DB592807202A0060589F /* Widgets */,
C9A84F342644931E0014D8E0 /* SwiftUI */,
042C88862643DB2200E7DBB2 /* UIkit */,
C9C73E9724FC471E00EF9516 /* AppDelegate.swift */,
C9C73E9924FC471E00EF9516 /* SceneDelegate.swift */,
C9C73EA524FC471E00EF9516 /* Info.plist */,
042C88822643D6B900E7DBB2 /* Main.storyboard */,
C3357CA0280F42EC00F03B6F /* ExamplesMaster.swift */,
C3357CA4280F430000F03B6F /* ExamplesDetail.swift */,
C9C73E9D24FC471E00EF9516 /* Assets.xcassets */,
C9C73E9F24FC471E00EF9516 /* Preview Content */,
042C88822643D6B900E7DBB2 /* Main.storyboard */,
04A8F6C226452F25002C909A /* lib */,
C9C73E9924FC471E00EF9516 /* SceneDelegate.swift */,
C9C73E9724FC471E00EF9516 /* AppDelegate.swift */,
C9C73EA524FC471E00EF9516 /* Info.plist */,
);
path = Source;
sourceTree = "<group>";
@@ -458,9 +464,11 @@
C9CB2F13264C92D200E7FF0D /* RiveComponents.swift in Sources */,
042C888E2644230700E7DBB2 /* utility.swift in Sources */,
C3D187F3280751A8008B739A /* RiveProgressBar.swift in Sources */,
C3357CA5280F430000F03B6F /* ExamplesDetail.swift in Sources */,
E5CD7D7127DC331900BFE5E2 /* SwiftMeshAnimation.swift in Sources */,
042C88902644250D00E7DBB2 /* MultipleAnimations.swift in Sources */,
C3468E6227FDCBC6008652FD /* SimpleSlider.swift in Sources */,
C3357CA1280F42EC00F03B6F /* ExamplesMaster.swift in Sources */,
C324DB5628071EB80060589F /* RiveSwitch.swift in Sources */,
04026DC827CE3EE6002B3DBF /* SwiftLayout.swift in Sources */,
04026DCC27CE3F03002B3DBF /* SwiftLoopMode.swift in Sources */,

View File

@@ -0,0 +1,113 @@
//
// ExamplesMaster.swift
// RiveExample
//
// Created by Zachary Duncan on 4/19/22.
// Copyright © 2022 Rive. All rights reserved.
//
import SwiftUI
import RiveRuntime
class ExamplesMasterTableViewController: UITableViewController {
private let storyboardIDs: [String] = [
"Simple Animation",
"Layout",
"MultipleAnimations",
"Loop Mode",
"State Machine",
// "iOS Player",
"Blend Mode",
"Slider Widget"
]
private enum SwiftViews: StringLiteralType, CaseIterable {
case components = "Widget Collection"
case simpleAnimation = "Simple Animation"
case layout = "Layout"
case multiple = "MultipleAnimations"
case loop = "Loop Mode"
case stateMachine = "State Machine"
case mesh = "Mesh Animation"
}
private let viewModels: [(String, RiveViewModel)] = [
("Slider Widget", RiveSlider())
]
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return storyboardIDs.count + SwiftViews.allCases.count + viewModels.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let i = indexPath.row
let cell = UITableViewCell()
// ViewControllers made from Storyboard IDs
if i < storyboardIDs.count {
cell.textLabel?.text = storyboardIDs[indexPath.row]
}
// Views made by custom SwiftUI Views
else if i < storyboardIDs.count + SwiftViews.allCases.count {
cell.textLabel?.text = SwiftViews.allCases[i - storyboardIDs.count].rawValue
}
// Views made by the ViewModels
else {
cell.textLabel?.text = viewModels[i - (storyboardIDs.count + SwiftViews.allCases.count)].0
}
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let i = indexPath.row
var controller: UIViewController
// ViewControllers made from Storyboard IDs
if i < storyboardIDs.count {
controller = storyboard!.instantiateViewController(withIdentifier: storyboardIDs[i])
}
// Views made by custom SwiftUI Views
else if i < storyboardIDs.count + SwiftViews.allCases.count {
var anyView: AnyView
switch SwiftViews.allCases[i - storyboardIDs.count] {
case .components: anyView = typeErased(dismissableView: RiveComponents())
case .simpleAnimation: anyView = typeErased(dismissableView: SwiftSimpleAnimation())
case .layout: anyView = typeErased(dismissableView: SwiftLayout())
case .multiple: anyView = typeErased(dismissableView: SwiftMultipleAnimations())
case .loop: anyView = typeErased(dismissableView: SwiftLoopMode())
case .stateMachine: anyView = typeErased(dismissableView: SwiftStateMachine())
case .mesh: anyView = typeErased(dismissableView: SwiftMeshAnimation())
}
controller = UIHostingController(rootView: anyView)
}
// Views made by the ViewModels
else {
let anyView = AnyView(viewModels[i - (storyboardIDs.count + SwiftViews.allCases.count)].1.view())
controller = UIHostingController(rootView: anyView)
}
splitViewController?.showDetailViewController(controller, sender: self)
}
private func typeErased<Content: DismissableView>(dismissableView: Content) -> AnyView {
var view = dismissableView
view.dismiss = {
self.dismiss(animated: true, completion: nil)
self.navigationController?.popViewController(animated: true)
}
return AnyView(view)
}
}
public protocol DismissableView: View {
init()
var dismiss: () -> Void { get set }
}

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="FPy-V6-MlI">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="Jj8-QH-eAe">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
@@ -9,6 +9,75 @@
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="Ofc-Em-JP5">
<objects>
<viewController id="Rif-Z2-ml6" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="yE1-5o-Uq1">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<viewLayoutGuide key="safeArea" id="vdE-WD-ztg"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="QEY-6T-0Mo" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="117" y="-1045"/>
</scene>
<!--Root View Controller-->
<scene sceneID="XV1-T1-lAJ">
<objects>
<tableViewController clearsSelectionOnViewWillAppear="NO" id="oFD-NX-sZZ" customClass="ExamplesMasterTableViewController" customModule="RiveExample" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="-1" estimatedSectionHeaderHeight="-1" sectionFooterHeight="-1" estimatedSectionFooterHeight="-1" id="WCh-4c-dF3">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" id="0PG-f3-SIb">
<rect key="frame" x="0.0" y="44.5" width="414" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="0PG-f3-SIb" id="srj-Fp-thS">
<rect key="frame" x="0.0" y="0.0" width="414" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
</tableViewCellContentView>
</tableViewCell>
</prototypes>
<connections>
<outlet property="dataSource" destination="oFD-NX-sZZ" id="tW3-o5-5go"/>
<outlet property="delegate" destination="oFD-NX-sZZ" id="el9-mJ-yKI"/>
</connections>
</tableView>
<navigationItem key="navigationItem" title="Root View Controller" id="D8Z-my-oJi"/>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="HFb-68-BQh" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1038" y="-1918"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="foC-i9-QZA">
<objects>
<navigationController id="0Wt-ue-AAA" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" id="pOo-q8-9Up">
<rect key="frame" x="0.0" y="44" width="414" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="HNW-hv-lLR" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="116" y="-2236"/>
</scene>
<!--Split View Controller-->
<scene sceneID="3PL-ZH-SYd">
<objects>
<splitViewController allowDoubleColumnStyle="YES" id="Jj8-QH-eAe" sceneMemberID="viewController">
<connections>
<segue destination="oFD-NX-sZZ" kind="relationship" relationship="masterViewController" id="Uis-3l-OTR"/>
</connections>
</splitViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="o1k-3I-tAX" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-741" y="-1614"/>
</scene>
<!--Examples-->
<scene sceneID="s0d-6b-0kx">
<objects>
@@ -168,12 +237,12 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Ief-a0-LHa" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1039" y="151"/>
<point key="canvasLocation" x="1038" y="25"/>
</scene>
<!--Simple Slider View Controller-->
<scene sceneID="Pvx-pO-5XB">
<objects>
<viewController id="nXP-c2-Cpg" customClass="SimpleSliderViewController" customModule="RiveExample" customModuleProvider="target" sceneMemberID="viewController">
<viewController storyboardIdentifier="Slider Widget" id="nXP-c2-Cpg" customClass="SimpleSliderViewController" customModule="RiveExample" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="2zm-EC-beS">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -199,12 +268,12 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="btb-K4-jol" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="2771" y="270"/>
<point key="canvasLocation" x="7319" y="-358"/>
</scene>
<!--Layout-->
<scene sceneID="f8y-qg-uzH">
<objects>
<viewController id="6EP-ej-U9V" customClass="LayoutViewController" customModule="RiveExample" customModuleProvider="target" sceneMemberID="viewController">
<viewController storyboardIdentifier="Layout" id="6EP-ej-U9V" customClass="LayoutViewController" customModule="RiveExample" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="ogd-2a-ycI" customClass="LayoutView" customModule="RiveExample" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -393,12 +462,12 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iPR-UO-vO8" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="2516" y="-984"/>
<point key="canvasLocation" x="3052" y="-358"/>
</scene>
<!--Blend Modes-->
<scene sceneID="JXR-CF-wxg">
<objects>
<viewController id="6Y6-o9-aZy" customClass="BlendModeViewController" customModule="RiveExample" customModuleProvider="target" sceneMemberID="viewController">
<viewController storyboardIdentifier="Blend Mode" id="6Y6-o9-aZy" customClass="BlendModeViewController" customModule="RiveExample" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="nG9-ag-3SU">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -409,12 +478,12 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="0JN-k1-xkH" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="6045" y="-984"/>
<point key="canvasLocation" x="6581" y="-358"/>
</scene>
<!--Loop Mode-->
<scene sceneID="iqU-00-Krb">
<objects>
<viewController id="fGr-bk-Efd" customClass="LoopModeController" customModule="RiveExample" customModuleProvider="target" sceneMemberID="viewController">
<viewController storyboardIdentifier="Loop Mode" id="fGr-bk-Efd" customClass="LoopModeController" customModule="RiveExample" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="PUC-Yj-uP6" customClass="LoopMode" customModule="RiveExample" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -637,12 +706,12 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Ozx-fu-trC" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="3914" y="-984"/>
<point key="canvasLocation" x="4449" y="-358"/>
</scene>
<!--State Machine-->
<scene sceneID="sMa-mk-G4H">
<objects>
<viewController id="tat-Jb-Aap" customClass="StateMachineViewController" customModule="RiveExample" customModuleProvider="target" sceneMemberID="viewController">
<viewController storyboardIdentifier="State Machine" id="tat-Jb-Aap" customClass="StateMachineViewController" customModule="RiveExample" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="EmG-VF-nMb" customClass="StateMachineView" customModule="RiveExample" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -720,12 +789,12 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="qYD-XH-vp4" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="4599" y="-984"/>
<point key="canvasLocation" x="5135" y="-358"/>
</scene>
<!--iOS Player-->
<scene sceneID="8FV-8I-h1w">
<objects>
<viewController id="bLr-Sd-R4P" customClass="IOSPlayerViewController" customModule="RiveExample" customModuleProvider="target" sceneMemberID="viewController">
<viewController storyboardIdentifier="iOS Player" id="bLr-Sd-R4P" customClass="IOSPlayerViewController" customModule="RiveExample" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="atc-Qh-uPc" customClass="IOSPlayerView" customModule="RiveExample" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -803,7 +872,7 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="jt7-3l-j1T" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="5325" y="-984"/>
<point key="canvasLocation" x="5861" y="-358"/>
</scene>
<!--Hosting Controller-->
<scene sceneID="FCb-Pg-8ib">
@@ -813,12 +882,12 @@
</hostingController>
<placeholder placeholderIdentifier="IBFirstResponder" id="SUL-R1-Glq" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="138" y="1501"/>
<point key="canvasLocation" x="3090" y="356"/>
</scene>
<!--Multiple Animations-->
<scene sceneID="RWJ-v9-IHm">
<objects>
<viewController id="qQy-Yc-tGr" customClass="MultipleAnimationsController" customModule="RiveExample" customModuleProvider="target" sceneMemberID="viewController">
<viewController storyboardIdentifier="MultipleAnimations" id="qQy-Yc-tGr" customClass="MultipleAnimationsController" customModule="RiveExample" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Vnx-gq-hge" customClass="MultipleAnimations" customModule="RiveExample" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
@@ -974,12 +1043,12 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Yc7-ml-Tkq" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="3229" y="-984"/>
<point key="canvasLocation" x="3765" y="-358"/>
</scene>
<!--Simple Animation Example-->
<scene sceneID="b8F-wH-PQu">
<objects>
<viewController title="Simple Animation Example" id="l4C-BT-Wpi" customClass="SimpleAnimationViewController" customModule="RiveExample" customModuleProvider="target" sceneMemberID="viewController">
<viewController storyboardIdentifier="Simple Animation" title="Simple Animation Example" id="l4C-BT-Wpi" customClass="SimpleAnimationViewController" customModule="RiveExample" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="dF4-O8-Npa">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -990,17 +1059,17 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="xxk-hl-V9T" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1842" y="-984"/>
<point key="canvasLocation" x="2377" y="-358"/>
</scene>
<!--Hosting Controller-->
<scene sceneID="ywB-z0-0QJ">
<objects>
<placeholder placeholderIdentifier="IBFirstResponder" id="tzM-Rx-Bel" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
<hostingController id="w39-2n-FCH" sceneMemberID="viewController">
<navigationItem key="navigationItem" id="GYU-ku-HRS"/>
</hostingController>
<placeholder placeholderIdentifier="IBFirstResponder" id="tzM-Rx-Bel" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-664" y="1501"/>
<point key="canvasLocation" x="3817" y="356"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="Vw7-FC-sqO">
@@ -1013,12 +1082,12 @@
</navigationBar>
<nil name="viewControllers"/>
<connections>
<segue destination="Y6W-OH-hqX" kind="relationship" relationship="rootViewController" id="no0-hV-qek"/>
<segue destination="Y6W-OH-hqX" kind="relationship" relationship="rootViewController" id="HkN-b4-uJ2"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="EYg-Zx-cpS" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="137.68115942028987" y="138.61607142857142"/>
<point key="canvasLocation" x="146" y="25"/>
</scene>
<!--Hosting Controller-->
<scene sceneID="iwq-aZ-Vk6">
@@ -1028,7 +1097,7 @@
</hostingController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Wo1-9T-STv" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1912" y="847"/>
<point key="canvasLocation" x="2378" y="356"/>
</scene>
</scenes>
<inferredMetricsTieBreakers>

View File

@@ -15,60 +15,65 @@ class ExamplesViewController: UIViewController {
// @IBSegueAction func showRiveExplorer(_ coder: NSCoder) -> UIViewController? {
// return HostingController<RiveExplorer>(coder: coder)
// }
@IBSegueAction func showRiveComponents(_ coder: NSCoder) -> UIViewController? {
return HostingController<RiveComponents>(coder: coder)
}
@IBSegueAction func showSimpleAnimation(_ coder: NSCoder) -> UIViewController? {
return HostingController<SwiftSimpleAnimation>(coder: coder)
}
@IBSegueAction func showLayout(_ coder: NSCoder) -> UIViewController? {
return HostingController<SwiftLayout>(coder: coder)
}
@IBSegueAction func showMultipleAnimations(_ coder: NSCoder) -> UIViewController? {
return HostingController<SwiftMultipleAnimations>(coder: coder)
}
@IBSegueAction func showLoopMode(_ coder: NSCoder) -> UIViewController? {
return HostingController<SwiftLoopMode>(coder: coder)
}
@IBSegueAction func showStateMachine(_ coder: NSCoder) -> UIViewController? {
return HostingController<SwiftStateMachine>(coder: coder)
}
@IBSegueAction func showMeshExample(_ coder: NSCoder) -> UIViewController? {
return HostingController<SwiftMeshAnimation>(coder: coder)
}
@IBAction func showSwiftUISlider(_ sender: Any) {
let controller = UIHostingController(rootView: RiveSlider().view())
navigationController?.pushViewController(controller, animated: true)
}
@IBSegueAction func showUIKitSlider(_ coder: NSCoder) -> SimpleSliderViewController? {
return SimpleSliderViewController(coder: coder)
}
@IBSegueAction func showUIKitMultiAnimations(_ coder: NSCoder) -> MultipleAnimationsController? {
return MultipleAnimationsController(coder: coder)
}
}
fileprivate class HostingController<Content: DismissableView>: UIHostingController<Content> {
required init?(coder: NSCoder) {
super.init(coder: coder, rootView: Content())
rootView.dismiss = {
self.dismiss(animated: true, completion: nil)
self.navigationController?.popViewController(animated: true)
}
}
}
public protocol DismissableView: View {
init()
var dismiss: () -> Void { get set }
//
// @IBSegueAction func showRiveComponents(_ coder: NSCoder) -> UIViewController? {
// return HostingController<RiveComponents>(coder: coder)
// }
//
// @IBSegueAction func showSimpleAnimation(_ coder: NSCoder) -> UIViewController? {
// return HostingController<SwiftSimpleAnimation>(coder: coder)
// }
//
// @IBSegueAction func showLayout(_ coder: NSCoder) -> UIViewController? {
// return HostingController<SwiftLayout>(coder: coder)
// }
//
// @IBSegueAction func showMultipleAnimations(_ coder: NSCoder) -> UIViewController? {
// return HostingController<SwiftMultipleAnimations>(coder: coder)
// }
//
// @IBSegueAction func showLoopMode(_ coder: NSCoder) -> UIViewController? {
// return HostingController<SwiftLoopMode>(coder: coder)
// }
//
// @IBSegueAction func showStateMachine(_ coder: NSCoder) -> UIViewController? {
// var foo = SwiftStateMachine.self
// return HostingController<SwiftStateMachine>(coder: coder)
// }
//
// @IBSegueAction func showMeshExample(_ coder: NSCoder) -> UIViewController? {
// return HostingController<SwiftMeshAnimation>(coder: coder)
// }
//
// @IBAction func showSwiftUISlider(_ sender: Any) {
// let controller = UIHostingController(rootView: RiveSlider().view())
// navigationController?.pushViewController(controller, animated: true)
// }
//
// @IBSegueAction func showUIKitSlider(_ coder: NSCoder) -> SimpleSliderViewController? {
// return SimpleSliderViewController(coder: coder)
// }
//
// @IBSegueAction func showUIKitMultiAnimations(_ coder: NSCoder) -> MultipleAnimationsController? {
// return MultipleAnimationsController(coder: coder)
// }
}
//
//class HostingController<Content: DismissableView>: UIHostingController<Content> {
// override init(rootView: Content) {
// super.init(rootView: rootView)
//
// self.rootView.dismiss = {
// self.dismiss(animated: true, completion: nil)
// self.navigationController?.popViewController(animated: true)
// }
// }
//
// required init?(coder: NSCoder) {
// super.init(coder: coder, rootView: Content())
// rootView.dismiss = {
// self.dismiss(animated: true, completion: nil)
// self.navigationController?.popViewController(animated: true)
// }
// }
//}