// // ASLayoutSpec+Subclasses.m // AsyncDisplayKit // // Created by Michael Schneider on 9/15/16. // Copyright © 2016 Facebook. All rights reserved. // #import #import #import #pragma mark - ASNullLayoutSpec @interface ASNullLayoutSpec : ASLayoutSpec - (instancetype)init NS_UNAVAILABLE; + (ASNullLayoutSpec *)null; @end @implementation ASNullLayoutSpec : ASLayoutSpec + (ASNullLayoutSpec *)null { static ASNullLayoutSpec *sharedNullLayoutSpec = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedNullLayoutSpec = [[self alloc] init]; }); return sharedNullLayoutSpec; } - (BOOL)isMutable { return NO; } - (ASLayout *)calculateLayoutThatFits:(ASSizeRange)constrainedSize { return [ASLayout layoutWithLayoutElement:self size:CGSizeZero]; } @end #pragma mark - ASLayoutSpec (Subclassing) @implementation ASLayoutSpec (Subclassing) #pragma mark - Final layoutElement - (id)layoutElementToAddFromLayoutElement:(id)child { if (self.isFinalLayoutElement == NO) { id finalLayoutElement = [child finalLayoutElement]; if (finalLayoutElement != child) { #if AS_TARGET_OS_IOS finalLayoutElement.primitiveTraitCollection = child.primitiveTraitCollection; #endif return finalLayoutElement; } } return child; } #pragma mark - Child with index - (void)setChild:(id)child atIndex:(NSUInteger)index { ASDisplayNodeAssert(self.isMutable, @"Cannot set properties when layout spec is not mutable"); id layoutElement = child ? [self layoutElementToAddFromLayoutElement:child] : [ASNullLayoutSpec null]; if (child) { if (_childrenArray.count < index) { // Fill up the array with null objects until the index NSInteger i = _childrenArray.count; while (i < index) { _childrenArray[i] = [ASNullLayoutSpec null]; i++; } } } // Replace object at the given index with the layoutElement _childrenArray[index] = layoutElement; } - (id)childAtIndex:(NSUInteger)index { id layoutElement = nil; if (index < _childrenArray.count) { layoutElement = _childrenArray[index]; } // Null layoutElement should not be accessed ASDisplayNodeAssert(layoutElement != [ASNullLayoutSpec null], @"Access child at index without set a child at that index"); return layoutElement; } @end