[iOS] Texture - 2. Nodeの概念と使い方


ノードとは?


Nodeはビューオブジェクトを囲み、UI内のフレームワークの落下やスレッドの問題を安全かつ柔軟に処理します.

ノードのタイプ


Node

  • UIView: ASDisplayNode
  • UIScrollView: ASScrollNode
  • UITableViewCell, UICollectionViewCell: ASCellNode
  • UILabel: ASTextNode
  • UITextView: ASEditableTextNode
  • UIImageView: ASImageNode
  • AVPlayerLayer: ASVideoNode
  • UIMoviePlayer: ASVideoPlayerNode
  • UIControl: ASControlNode
  • UIButton: ASButtonNode
  • MKMapView: ASMapNode
  • 既存のUIViewの大部分をNodeで置き換えることができ、NodeはUIViewが提供しない機能もサポートします.

    Node Containers

  • UIViewController: ASDKViewController
  • UICollectionView: ASCollectionNode
  • UITableView: ASTableNode
  • UIPageViewController: ASPagerNode
  • UINavigationController: ASNavigationController
  • UITabBarController: ASTabBarController
  • ノードコンテンツを使用して、ノードの非同期実行を自動的に管理します.

    Nodeの使い方



    画面の中央に簡単な情報を置く
    MessageNode.swift
    class MessageNode: ASDisplayNode {
        
        lazy var textNode = { () -> ASTextNode in
            let node = ASTextNode()
            node.attributedText = NSAttributedString(
                string: "Hello iOS",
                attributes:
                    [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 20)]
            )
            return node
        }()
        
        override init() { // Background
            super.init()
            self.automaticallyManagesSubnodes = true
            self.backgroundColor = .systemBackground
        }
        
        override func didLoad() { // Main
            super.didLoad()
        }
        
        override func layoutSpecThatFits(_ constrainedSize: ASSizeRange) -> ASLayoutSpec { // Background
            return ASStackLayoutSpec(
                direction: .vertical,
                spacing: 0,
                justifyContent: .center,
                alignItems: .center,
                children: [textNode]
            )
        }
        
        override func layout() { // Main
            super.layout()
        }
    }
    「Hello iOS」メッセージを表示するノードを作成します.
    layoutSpecThatFitsメソッドを使用して、レイアウトの方向、間隔、レイアウト、位置合わせなどのレイアウトの組織を作成します.
    ViewController.swift
    import AsyncDisplayKit
    
    class ViewController: ASDKViewController<MessageNode> {
        
        override init() {
            super.init(node: MessageNode())
            self.node.automaticallyManagesSubnodes = true
        }
        
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    }
    
    メッセージノードをViewControllerに表示します.
    Subnodesの自動管理が有効になっている場合、サブノードの追加または削除は、レイアウト構築中に自動的に処理されます.

    ノードのライフサイクル


    Initメソッド


    UIdiewはプライマリ・スレッドで動作し、ノードはバックグラウンド・スレッドで動作します.
    ▲ヴェルナ.プライマリ・スレッドからアクセスできるプロパティ(layerなど)はdidLoadメソッドでアクセスする必要があります.

    didLoadメソッド


    Initメソッドが完了してノードオブジェクトになったときに呼び出され、これらのプロパティはプライマリ・スレッドで動作してプライマリ・スレッドにアクセスできます.

    layoutSpecThatFitsメソッド


    Yoga Layout Flex Boxに基づいて、バックグラウンドスレッドでレイアウトを設計し、構築します.
    プライマリ・スレッドで使用可能な要素は使用できません.

    レイアウト方法


    layoutSpecThatFitsメソッドでレイアウトを構築すると、メインスレッドでレイアウトを変更するたびにレイアウトが呼び出されます.Releautの変更に従って更新する必要がある他の要素を処理します.