ComponentKit/LayoutComponents/CKOverlayLayoutComponent.mm (52 lines of code) (raw):

/* * Copyright (c) 2014-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * */ #import "CKOverlayLayoutComponent.h" #import <RenderCore/RCAssert.h> #import <ComponentKit/CKMacros.h> #import <ComponentKit/CKComponentInternal.h> #import <ComponentKit/CKComponentPerfScope.h> #import "CKComponentSubclass.h" @implementation CKOverlayLayoutComponent { CKComponent *_overlay; CKComponent *_component; } - (instancetype)initWithComponent:(CKComponent *)component overlay:(CKComponent *)overlay { CKComponentPerfScope perfScope(self.class); if (self = [super initWithView:{} size:{}]) { self->_overlay = overlay; self->_component = component; } return self; } #pragma mark - CKMountable - (unsigned int)numberOfChildren { return RCIterable::numberOfChildren(_component, _overlay); } - (id<CKMountable>)childAtIndex:(unsigned int)index { return RCIterable::childAtIndex(self, index, _component, _overlay); } /** First layout the contents, then fit the overlay on top of it. */ - (RCLayout)computeLayoutThatFits:(CKSizeRange)constrainedSize restrictedToSize:(const RCComponentSize &)size relativeToParentSize:(CGSize)parentSize { RCAssert(size == RCComponentSize(), @"CKOverlayLayoutComponent only passes size {} to the super class initializer, but received size %@ " "(component=%@, overlay=%@)", size.description(), _component, _overlay); // This variable needs to be mutable so we can move from it. /* const */ RCLayout contentsLayout = [_component layoutThatFits:constrainedSize parentSize:parentSize]; const auto contentsLayoutSize = contentsLayout.size; return { self, contentsLayoutSize, _overlay ? std::vector<RCLayoutChild> { {{0,0}, std::move(contentsLayout)}, {{0,0}, [_overlay layoutThatFits:{contentsLayoutSize, contentsLayoutSize} parentSize:contentsLayoutSize]}, } : std::vector<RCLayoutChild> { {{0,0}, std::move(contentsLayout)}, } }; } @end