forked from TextureGroup/Texture
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path_ASCollectionViewCell.mm
More file actions
151 lines (124 loc) · 4.37 KB
/
Copy path_ASCollectionViewCell.mm
File metadata and controls
151 lines (124 loc) · 4.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
//
// _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
//
#import <AsyncDisplayKit/_ASCollectionViewCell.h>
#import <AsyncDisplayKit/ASDisplayNode+Subclasses.h>
#import <AsyncDisplayKit/ASCellNode+Internal.h>
#import <AsyncDisplayKit/ASCollectionElement.h>
#import <AsyncDisplayKit/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
{
ASCellNode *node = self.node;
UIView *nodeView = node.view;
/**
* 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.
*/
CGPoint originPointOnView = [self convertPoint:nodeView.bounds.origin fromView:nodeView];
if (![super hitTest:originPointOnView withEvent:event]) {
return nil;
}
CGPoint pointOnNode = [node.view convertPoint:point fromView:self];
return [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