2019-11-09 23:14:22 +04:00

150 lines
4.2 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// _ASCollectionViewCell.mm
// Texture
//
// Copyright (c) Facebook, Inc. and its affiliates. All rights reserved.
// Changes after 4/13/2017 are: Copyright (c) Pinterest, Inc. All rights reserved.
// Licensed under Apache 2.0: http://www.apache.org/licenses/LICENSE-2.0
//
#ifndef MINIMAL_ASDK
#import <AsyncDisplayKit/_ASCollectionViewCell.h>
#import <AsyncDisplayKit/ASDisplayNode+Subclasses.h>
#import <AsyncDisplayKit/ASCellNode+Internal.h>
#import <AsyncDisplayKit/ASCollectionElement.h>
#import "Private/ASInternalHelpers.h"
@implementation _ASCollectionViewCell
- (ASCellNode *)node
{
return self.element.node;
}
- (void)setElement:(ASCollectionElement *)element
{
ASDisplayNodeAssertMainThread();
ASCellNode *node = element.node;
node.layoutAttributes = _layoutAttributes;
_element = element;
[node __setSelectedFromUIKit:self.selected];
[node __setHighlightedFromUIKit:self.highlighted];
}
- (BOOL)consumesCellNodeVisibilityEvents
{
ASCellNode *node = self.node;
if (node == nil) {
return NO;
}
return ASSubclassOverridesSelector([ASCellNode class], [node class], @selector(cellNodeVisibilityEvent:inScrollView:withCellFrame:));
}
- (void)cellNodeVisibilityEvent:(ASCellNodeVisibilityEvent)event inScrollView:(UIScrollView *)scrollView
{
[self.node cellNodeVisibilityEvent:event inScrollView:scrollView withCellFrame:self.frame];
}
- (void)setSelected:(BOOL)selected
{
[super setSelected:selected];
[self.node __setSelectedFromUIKit:selected];
}
- (void)setHighlighted:(BOOL)highlighted
{
[super setHighlighted:highlighted];
[self.node __setHighlightedFromUIKit:highlighted];
}
- (void)setLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
{
_layoutAttributes = layoutAttributes;
self.node.layoutAttributes = layoutAttributes;
}
- (void)prepareForReuse
{
self.layoutAttributes = nil;
// Need to clear element before UIKit calls setSelected:NO / setHighlighted:NO on its cells
self.element = nil;
[super prepareForReuse];
}
/**
* In the initial case, this is called by UICollectionView during cell dequeueing, before
* we get a chance to assign a node to it, so we must be sure to set these layout attributes
* on our node when one is next assigned to us in @c setNode: . Since there may be cases when we _do_ already
* have our node assigned e.g. during a layout update for existing cells, we also attempt
* to update it now.
*/
- (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
{
[super applyLayoutAttributes:layoutAttributes];
self.layoutAttributes = layoutAttributes;
}
/**
* Keep our node filling our content view.
*/
- (void)layoutSubviews
{
[super layoutSubviews];
self.node.frame = self.contentView.bounds;
}
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
/**
* The documentation for hitTest:withEvent: on an UIView explicitly states the fact that:
* it ignores view objects that are hidden, that have disabled user interactions, or have an
* alpha level less than 0.01.
* To be able to determine if the collection view cell should skip going further down the tree
* based on the states above we use a valid point within the cells bounds and check the
* superclass hitTest:withEvent: implementation. If this returns a valid value we can go on with
* checking the node as it's expected to not be in one of these states.
*/
if (![super hitTest:self.bounds.origin withEvent:event]) {
return nil;
}
CGPoint pointOnNode = [self.node.view convertPoint:point fromView:self];
return [self.node hitTest:pointOnNode withEvent:event];
}
- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event
{
CGPoint pointOnNode = [self.node.view convertPoint:point fromView:self];
return [self.node pointInside:pointOnNode withEvent:event];
}
@end
/**
* A category that makes _ASCollectionViewCell conform to IGListBindable.
*
* We don't need to do anything to bind the view model the cell node
* serves the same purpose.
*/
#if __has_include(<IGListKit/IGListBindable.h>)
#import <IGListKit/IGListBindable.h>
@interface _ASCollectionViewCell (IGListBindable) <IGListBindable>
@end
@implementation _ASCollectionViewCell (IGListBindable)
- (void)bindViewModel:(id)viewModel
{
// nop
}
@end
#endif
#endif