// ref: https://github.com/Adlai-Holler/ASDKPlaceholderTest/blob/eea9fa7cff2d16a57efb47d208422ea9b49a630a/ASDKPlaceholderTest/ASDisplayNodeSubclasses.swift #if ASDK import Foundation import AsyncDisplayKit import UIKit /** A node that shows a `UIActivityIndicatorView`. Does not support layer backing. Note: You must not change the style to or from `.WhiteLarge` after init, or the node's size will not update. */ class ActivityIndicatorNode: ASDisplayNode { private static let defaultSize = CGSize(width: 20, height: 20) private static let largeSize = CGSize(width: 37, height: 37) init(style: UIActivityIndicatorView.Style = .medium) { super.init() setViewBlock { UIActivityIndicatorView(style: style) } self.style.preferredSize = style == .large ? ActivityIndicatorNode.defaultSize : ActivityIndicatorNode.largeSize } var activityIndicatorView: UIActivityIndicatorView { return view as! UIActivityIndicatorView } override func didLoad() { super.didLoad() if animating { activityIndicatorView.startAnimating() } activityIndicatorView.color = color activityIndicatorView.hidesWhenStopped = hidesWhenStopped } /// Wrapper for `UIActivityIndicatorView.hidesWhenStopped`. NOTE: You must respect thread affinity. var hidesWhenStopped = true { didSet { if isNodeLoaded { assert(Thread.isMainThread) activityIndicatorView.hidesWhenStopped = hidesWhenStopped } } } /// Wrapper for `UIActivityIndicatorView.color`. NOTE: You must respect thread affinity. var color: UIColor? { didSet { if isNodeLoaded { assert(Thread.isMainThread) activityIndicatorView.color = color } } } /// Wrapper for `UIActivityIndicatorView.animating`. NOTE: You must respect thread affinity. var animating = false { didSet { if isNodeLoaded { assert(Thread.isMainThread) if animating { activityIndicatorView.startAnimating() } else { activityIndicatorView.stopAnimating() } } } } } #endif