ComponentKit/DataSources/CKCollectionViewDataSourceCell.mm (33 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 "CKCollectionViewDataSourceCell.h" #import <ComponentKit/CKDelayedNonNull.h> #import "CKComponentRootView.h" @implementation CKCollectionViewDataSourceCell { CK::DelayedNonNull<CKComponentRootView *> _rootView; } - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { // Ideally we could simply cause the cell's existing contentView to be of type CKComponentRootView. // Alas the only way to do this is via private API (_contentViewClass) so we are forced to add a subview. _rootView = CK::makeNonNull([[CKComponentRootView alloc] initWithFrame:CGRectZero]); [[self contentView] addSubview:_rootView]; } return self; } - (CK::NonNull<CKComponentRootView *>)rootView { return _rootView; } - (void)layoutSubviews { [super layoutSubviews]; const CGSize size = [[self contentView] bounds].size; [_rootView setFrame:CGRectMake(0, 0, size.width, size.height)]; } - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { UIView *hitView = [super hitTest:point withEvent:event]; // `hitTest` should purely rely on `CKComponentRootView`. if (hitView == self || hitView == self.contentView) { return nil; } return hitView; } @end