如何将 SwiftUI 视图包装在 ASDisplayNode 中
How to wrap a SwiftUI View inside a ASDisplayNode
今天我想找出一种连接 SwiftUI 和 Texture (AsyncDisplayKit) 的方法。
通过这种方式,我可以在详细视图中获得 AsyncDisplayKit、ASNetworkImage 等的速度和优势,以及 SwiftUI 和 Combine 的灵活性。
连接 SwiftUI 和纹理/AsyncDisplayKit
我们可以初始化一个节点并提供一个 SwiftUI 视图作为后台视图。
Text 视图嵌套在一个 UIHostingController
中,一个 UIViewController
子类表示 UIKit 上下文中的 SwiftUI 视图。
视图是通过一个块提供的,该块将 return 一个视图,以便可以保存视图的实际构造以备后用。节点显示步骤是同步发生的,因为节点只有在包裹了 _ASDisplayView
(内部视图子类)时才能异步显示,而不是在包裹了 UIView
.
时才能异步显示
//
// HostingNode.swift
//
import AsyncDisplayKit
import SwiftUI
class HostingNode: ASDisplayNode {
var viewController: UIViewController?
override init() {
super.init()
setViewBlock { [weak self]() -> UIView in
self?.viewController = self?.makeHostingController()
return self?.viewController?.view ?? UIView()
}
}
private func makeHostingController() -> UIViewController {
UIHostingController(
rootView: Text("Attention")
)
}
}
参考文献:
今天我想找出一种连接 SwiftUI 和 Texture (AsyncDisplayKit) 的方法。
通过这种方式,我可以在详细视图中获得 AsyncDisplayKit、ASNetworkImage 等的速度和优势,以及 SwiftUI 和 Combine 的灵活性。
连接 SwiftUI 和纹理/AsyncDisplayKit
我们可以初始化一个节点并提供一个 SwiftUI 视图作为后台视图。
Text 视图嵌套在一个 UIHostingController
中,一个 UIViewController
子类表示 UIKit 上下文中的 SwiftUI 视图。
视图是通过一个块提供的,该块将 return 一个视图,以便可以保存视图的实际构造以备后用。节点显示步骤是同步发生的,因为节点只有在包裹了 _ASDisplayView
(内部视图子类)时才能异步显示,而不是在包裹了 UIView
.
//
// HostingNode.swift
//
import AsyncDisplayKit
import SwiftUI
class HostingNode: ASDisplayNode {
var viewController: UIViewController?
override init() {
super.init()
setViewBlock { [weak self]() -> UIView in
self?.viewController = self?.makeHostingController()
return self?.viewController?.view ?? UIView()
}
}
private func makeHostingController() -> UIViewController {
UIHostingController(
rootView: Text("Attention")
)
}
}
参考文献: