import UIKit import AsyncDisplayKit public class NavigationTitleNode: ASDisplayNode { private let label: ImmediateTextNode private var _text: NSString = "" public var text: NSString { get { return self._text } set(value) { self._text = value self.setText(value) } } public var color: UIColor = UIColor.black { didSet { self.setText(self._text) } } public init(text: NSString) { self.label = ImmediateTextNode() self.label.maximumNumberOfLines = 1 self.label.truncationType = .end self.label.displaysAsynchronously = false super.init() self.addSubnode(self.label) self.setText(text) } public required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } private func setText(_ text: NSString) { var titleAttributes = [NSAttributedString.Key : AnyObject]() titleAttributes[NSAttributedString.Key.font] = UIFont.boldSystemFont(ofSize: 17.0) titleAttributes[NSAttributedString.Key.foregroundColor] = self.color let titleString = NSAttributedString(string: text as String, attributes: titleAttributes) self.label.attributedText = titleString self.invalidateCalculatedLayout() } public override func calculateSizeThatFits(_ constrainedSize: CGSize) -> CGSize { let _ = self.label.updateLayout(constrainedSize) return self.label.calculatedSize } public override func layout() { self.label.frame = self.bounds } }