FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
AsyncDisplayKit/Source/ASPagerFlowLayout.m at master · dymv/AsyncDisplayKit · GitHub
dymv
/
AsyncDisplayKit
Public
forked from
facebookarchive/AsyncDisplayKit
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Actions
Projects
Wiki
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Wiki
Security and quality
Insights
Expand file tree
Breadcrumbs
AsyncDisplayKit
/
Source
/
ASPagerFlowLayout.m
Copy path
More file actions
More file actions
Latest commit
History
History
History
113 lines (95 loc) · 3.62 KB
Breadcrumbs
AsyncDisplayKit
/
Source
/
ASPagerFlowLayout.m
Copy path
File metadata and controls
113 lines (95 loc) · 3.62 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
//
//
ASPagerFlowLayout.m
//
AsyncDisplayKit
//
//
Created by Levi McCallum on 2/12/16.
//
//
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
<
AsyncDisplayKit/ASPagerFlowLayout.h
>
#
import
<
AsyncDisplayKit/ASCellNode.h
>
#
import
<
AsyncDisplayKit/ASCollectionView.h
>
@interface
ASPagerFlowLayout
() {
__weak ASCellNode *_currentCellNode;
}
@end
//
TODO make this an ASCollectionViewLayout
@implementation
ASPagerFlowLayout
- (ASCollectionView *)
asCollectionView
{
//
Dynamic cast is too slow and not worth it.
return
(ASCollectionView *)self.
collectionView
;
}
- (
void
)
prepareLayout
{
[
super
prepareLayout
];
if
(_currentCellNode ==
nil
) {
[
self
_updateCurrentNode
];
}
}
- (CGPoint)
targetContentOffsetForProposedContentOffset
:
(CGPoint)
proposedContentOffset
{
//
Don't mess around if the user is interacting with the page node. Although if just a rotation happened we should
//
try to use the current index path to not end up setting the target content offset to something in between pages
if
(!self.
collectionView
.
decelerating
&& !self.
collectionView
.
tracking
) {
NSIndexPath
*indexPath = [
self
.asCollectionView
indexPathForNode:
_currentCellNode];
if
(indexPath) {
return
[
self
_targetContentOffsetForItemAtIndexPath:
indexPath
proposedContentOffset:
proposedContentOffset];
}
}
return
[
super
targetContentOffsetForProposedContentOffset:
proposedContentOffset];
}
- (CGPoint)
_targetContentOffsetForItemAtIndexPath
:
(
NSIndexPath
*)
indexPath
proposedContentOffset
:
(CGPoint)
proposedContentOffset
{
if
([
self
_dataSourceIsEmpty
]) {
return
proposedContentOffset;
}
UICollectionViewLayoutAttributes *attributes = [
self
layoutAttributesForItemAtIndexPath:
indexPath];
if
(attributes ==
nil
) {
return
proposedContentOffset;
}
CGFloat xOffset = (
CGRectGetWidth
(self.
collectionView
.
bounds
) -
CGRectGetWidth
(attributes.
frame
)) /
2.0
;
return
CGPointMake
(attributes.
frame
.
origin
.
x
- xOffset, proposedContentOffset.
y
);
}
- (
BOOL
)
_dataSourceIsEmpty
{
return
([
self
.collectionView
numberOfSections
] ==
0
||
[
self
.collectionView
numberOfItemsInSection:
0
] ==
0
);
}
- (
void
)
_updateCurrentNode
{
//
Never change node during an animated bounds change (rotation)
//
NOTE! Listening for -prepareForAnimatedBoundsChange and -finalizeAnimatedBoundsChange
//
isn't sufficient here! It's broken!
NSArray
*animKeys = self.
collectionView
.
layer
.
animationKeys
;
for
(
NSString
*key in animKeys) {
if
([key
hasPrefix:
@"
bounds
"
]) {
return
;
}
}
CGRect bounds = self.
collectionView
.
bounds
;
CGRect rect =
CGRectMake
(
CGRectGetMidX
(bounds),
CGRectGetMidY
(bounds),
1
,
1
);
NSIndexPath
*indexPath = [
self
layoutAttributesForElementsInRect:
rect].
firstObject
.
indexPath
;
if
(indexPath) {
ASCellNode *node = [
self
.asCollectionView
nodeForItemAtIndexPath:
indexPath];
if
(node) {
_currentCellNode = node;
}
}
}
- (
BOOL
)
shouldInvalidateLayoutForBoundsChange
:
(CGRect)
newBounds
{
[
self
_updateCurrentNode
];
return
[
super
shouldInvalidateLayoutForBoundsChange:
newBounds];
}
- (UICollectionViewLayoutInvalidationContext *)
invalidationContextForBoundsChange
:
(CGRect)
newBounds
{
UICollectionViewFlowLayoutInvalidationContext *ctx = (UICollectionViewFlowLayoutInvalidationContext *)[
super
invalidationContextForBoundsChange:
newBounds];
ctx.
invalidateFlowLayoutDelegateMetrics
=
YES
;
ctx.
invalidateFlowLayoutAttributes
=
YES
;
return
ctx;
}
@end
Back
|
FazBrowse Home
|
New Git URL