Skip to content

Commit 4f0633e

Browse files
committed
Add SwiftUI integration
1 parent 9b67245 commit 4f0633e

2 files changed

Lines changed: 64 additions & 0 deletions

File tree

Demo/SwiftUIPreview.swift

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
2+
import SwiftUI
3+
import AsyncDisplayKit
4+
import TextureBridging
5+
6+
enum Preview_Node: PreviewProvider {
7+
8+
private typealias TargetComponent = CustomNode
9+
10+
static var previews: some View {
11+
12+
Group {
13+
ViewHost(instantiated: NodeView(node: TargetComponent()))
14+
}
15+
16+
}
17+
18+
}
19+
20+
private final class CustomNode: ASDisplayNode {
21+
22+
private let textNode = ASTextNode()
23+
24+
override func didLoad() {
25+
super.didLoad()
26+
backgroundColor = .red
27+
28+
textNode.attributedText = "Hello".styled(.init())
29+
30+
automaticallyManagesSubnodes = true
31+
}
32+
33+
override func layoutSpecThatFits(_ constrainedSize: ASSizeRange) -> ASLayoutSpec {
34+
return ASWrapperLayoutSpec(layoutElements: [textNode])
35+
}
36+
37+
}
38+
39+
public struct ViewHost<ContentView: UIView>: UIViewRepresentable {
40+
41+
private let contentView: ContentView
42+
private let _update: @MainActor (_ uiView: ContentView, _ context: Context) -> Void
43+
44+
public init(
45+
instantiated: ContentView,
46+
update: @escaping @MainActor (_ uiView: ContentView, _ context: Context) -> Void = { _, _ in }
47+
) {
48+
self.contentView = instantiated
49+
self._update = update
50+
}
51+
52+
public func makeUIView(context: Context) -> ContentView {
53+
return contentView
54+
}
55+
56+
public func updateUIView(_ uiView: ContentView, context: Context) {
57+
_update(uiView, context)
58+
}
59+
60+
}

TextureSwiftSupport.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
4BE65277246481D8004346D6 /* AdaptiveLayoutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BE65276246481D8004346D6 /* AdaptiveLayoutViewController.swift */; };
8888
4BE6527A246481DE004346D6 /* SwitchCaseLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BE65278246481DE004346D6 /* SwitchCaseLayout.swift */; };
8989
4BE6527B246481DE004346D6 /* LayoutCondition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BE65279246481DE004346D6 /* LayoutCondition.swift */; };
90+
4BFCB9582992ECE000740508 /* SwiftUIPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BFCB9572992ECE000740508 /* SwiftUIPreview.swift */; };
9091
4BFE5FE12663DE9400C5C032 /* RootContainerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BFE5FE02663DE9400C5C032 /* RootContainerViewController.swift */; };
9192
4BFE5FE32663DEA900C5C032 /* Book.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BFE5FE22663DEA900C5C032 /* Book.swift */; };
9293
4BFE618A2663E8BF00C5C032 /* Book.InteractiveNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BFE61892663E8BF00C5C032 /* Book.InteractiveNode.swift */; };
@@ -190,6 +191,7 @@
190191
4BE65276246481D8004346D6 /* AdaptiveLayoutViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdaptiveLayoutViewController.swift; sourceTree = "<group>"; };
191192
4BE65278246481DE004346D6 /* SwitchCaseLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwitchCaseLayout.swift; sourceTree = "<group>"; };
192193
4BE65279246481DE004346D6 /* LayoutCondition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LayoutCondition.swift; sourceTree = "<group>"; };
194+
4BFCB9572992ECE000740508 /* SwiftUIPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUIPreview.swift; sourceTree = "<group>"; };
193195
4BFE5FE02663DE9400C5C032 /* RootContainerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootContainerViewController.swift; sourceTree = "<group>"; };
194196
4BFE5FE22663DEA900C5C032 /* Book.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Book.swift; sourceTree = "<group>"; };
195197
4BFE61892663E8BF00C5C032 /* Book.InteractiveNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Book.InteractiveNode.swift; sourceTree = "<group>"; };
@@ -360,6 +362,7 @@
360362
4B4F5C93267B2F0600D12273 /* Book.HStackLayout.swift */,
361363
4B837DBA28536F5E000B3EF7 /* Book.HostingNode.swift */,
362364
4B837DC028537779000B3EF7 /* Book.HostingCellNode.swift */,
365+
4BFCB9572992ECE000740508 /* SwiftUIPreview.swift */,
363366
4B3C42D7266DCBD000861ADD /* Util.swift */,
364367
4B3C42D9266DCCB600861ADD /* ZStackView.swift */,
365368
);
@@ -792,6 +795,7 @@
792795
4B2A018325B6E76E00D7C188 /* RecursiveLayoutViewController.swift in Sources */,
793796
4BB21B3E244E0E68008CA2A4 /* InstagramPostCellViewController.swift in Sources */,
794797
4BE65277246481D8004346D6 /* AdaptiveLayoutViewController.swift in Sources */,
798+
4BFCB9582992ECE000740508 /* SwiftUIPreview.swift in Sources */,
795799
4B873C4B230845E3006170B1 /* AppDelegate.swift in Sources */,
796800
4B837DBB28536F5E000B3EF7 /* Book.HostingNode.swift in Sources */,
797801
4B6262EB264FDE6C00540F0B /* Components.swift in Sources */,

0 commit comments

Comments
 (0)