ComponentKit/LayoutComponents/CKBackgroundLayoutComponent.mm (51 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 "CKBackgroundLayoutComponent.h"
#import <RenderCore/RCAssert.h>
#import <ComponentKit/CKMacros.h>
#import <ComponentKit/CKComponentInternal.h>
#import <ComponentKit/CKComponentPerfScope.h>
#import "CKComponentSubclass.h"
@implementation CKBackgroundLayoutComponent
{
CKComponent *_component;
CKComponent *_background;
}
- (instancetype)initWithComponent:(CKComponent *)component
background:(CKComponent *)background
{
CKComponentPerfScope perfScope(self.class);
if (self = [super initWithView:{} size:{}]) {
_component = component;
_background = background;
}
return self;
}
- (unsigned int)numberOfChildren
{
return RCIterable::numberOfChildren(_component, _background);
}
- (id<CKMountable>)childAtIndex:(unsigned int)index
{
return RCIterable::childAtIndex(self, index, _component, _background);
}
/**
First layout the contents, then fit the background image.
*/
- (RCLayout)computeLayoutThatFits:(CKSizeRange)constrainedSize
restrictedToSize:(const RCComponentSize &)size
relativeToParentSize:(CGSize)parentSize
{
RCAssert(size == RCComponentSize(),
@"CKBackgroundLayoutComponent only passes size {} to the super class initializer, but received size %@ "
"(component=%@, background=%@)", size.description(), _component, _background);
const RCLayout contentsLayout = [_component layoutThatFits:constrainedSize parentSize:parentSize];
return {
self,
contentsLayout.size,
_background
? std::vector<RCLayoutChild> {
{{0,0}, [_background layoutThatFits:{contentsLayout.size, contentsLayout.size} parentSize:contentsLayout.size]},
{{0,0}, contentsLayout},
}
: std::vector<RCLayoutChild> {
{{0,0}, contentsLayout}
}
};
}
@end