如何将SwiftUI视图包装在ASDisplayNode中

时间:2019-10-21 00:39:12

标签: ios swift swiftui asyncdisplaykit

今天我正试图找出一种将SwiftUI和Texture(AsyncDisplayKit)进行接口的方法。

这样,我可以在详细视图中获得AsyncDisplayKit,ASNetworkImage等的速度和优势,以及SwiftUI和Combine的灵活性。

1 个答案:

答案 0 :(得分:0)

连接SwiftUI和Texture / AsyncDisplayKit

我们可以初始化节点并提供一个SwiftUI视图用作后备视图。 文本视图嵌套在UIHostingController(一个UIViewController子类中,该子类表示UIKit上下文中的SwiftUI视图)。

该视图是通过一个块提供的,该块将返回一个视图,以便可以保存该视图的实际构造直到以后。节点显示步骤是同步发生的,因为节点只有在包装_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")
        )
    }
}

参考: