mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-12 09:19:52 +00:00
Improvements in ASCollectionGalleryLayoutDelegate (#496)
* Improvements in ASCollectionGalleryLayoutDelegate - It now can handle section inset, as well as interitem and line spacings - Other small changes * Fix build failure and update file licenses * Update CHANGELOG * Minor change * Another assertion on scrollable directions of gallery layout delegate
This commit is contained in:
parent
d2adb8f126
commit
fdc1f0468c
@ -429,9 +429,11 @@
|
|||||||
E54E81FC1EB357BD00FFE8E1 /* ASPageTable.h in Headers */ = {isa = PBXBuildFile; fileRef = E54E81FA1EB357BD00FFE8E1 /* ASPageTable.h */; };
|
E54E81FC1EB357BD00FFE8E1 /* ASPageTable.h in Headers */ = {isa = PBXBuildFile; fileRef = E54E81FA1EB357BD00FFE8E1 /* ASPageTable.h */; };
|
||||||
E54E81FD1EB357BD00FFE8E1 /* ASPageTable.m in Sources */ = {isa = PBXBuildFile; fileRef = E54E81FB1EB357BD00FFE8E1 /* ASPageTable.m */; };
|
E54E81FD1EB357BD00FFE8E1 /* ASPageTable.m in Sources */ = {isa = PBXBuildFile; fileRef = E54E81FB1EB357BD00FFE8E1 /* ASPageTable.m */; };
|
||||||
E55D86331CA8A14000A0C26F /* ASLayoutElement.mm in Sources */ = {isa = PBXBuildFile; fileRef = E55D86311CA8A14000A0C26F /* ASLayoutElement.mm */; };
|
E55D86331CA8A14000A0C26F /* ASLayoutElement.mm in Sources */ = {isa = PBXBuildFile; fileRef = E55D86311CA8A14000A0C26F /* ASLayoutElement.mm */; };
|
||||||
|
E5667E8C1F33871300FA6FC0 /* _ASCollectionGalleryLayoutInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E5667E8B1F33871300FA6FC0 /* _ASCollectionGalleryLayoutInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
|
||||||
|
E5667E8E1F33872700FA6FC0 /* _ASCollectionGalleryLayoutInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = E5667E8D1F33872700FA6FC0 /* _ASCollectionGalleryLayoutInfo.m */; };
|
||||||
E5711A2C1C840C81009619D4 /* ASCollectionElement.h in Headers */ = {isa = PBXBuildFile; fileRef = E5711A2A1C840C81009619D4 /* ASCollectionElement.h */; settings = {ATTRIBUTES = (Private, ); }; };
|
E5711A2C1C840C81009619D4 /* ASCollectionElement.h in Headers */ = {isa = PBXBuildFile; fileRef = E5711A2A1C840C81009619D4 /* ASCollectionElement.h */; settings = {ATTRIBUTES = (Private, ); }; };
|
||||||
E5711A301C840C96009619D4 /* ASCollectionElement.mm in Sources */ = {isa = PBXBuildFile; fileRef = E5711A2D1C840C96009619D4 /* ASCollectionElement.mm */; };
|
E5711A301C840C96009619D4 /* ASCollectionElement.mm in Sources */ = {isa = PBXBuildFile; fileRef = E5711A2D1C840C96009619D4 /* ASCollectionElement.mm */; };
|
||||||
E5775AFC1F13CE9F00CAC9BC /* _ASCollectionGalleryLayoutItem.h in Headers */ = {isa = PBXBuildFile; fileRef = E5775AFB1F13CE9F00CAC9BC /* _ASCollectionGalleryLayoutItem.h */; };
|
E5775AFC1F13CE9F00CAC9BC /* _ASCollectionGalleryLayoutItem.h in Headers */ = {isa = PBXBuildFile; fileRef = E5775AFB1F13CE9F00CAC9BC /* _ASCollectionGalleryLayoutItem.h */; settings = {ATTRIBUTES = (Private, ); }; };
|
||||||
E5775AFE1F13CF7400CAC9BC /* _ASCollectionGalleryLayoutItem.mm in Sources */ = {isa = PBXBuildFile; fileRef = E5775AFD1F13CF7400CAC9BC /* _ASCollectionGalleryLayoutItem.mm */; };
|
E5775AFE1F13CF7400CAC9BC /* _ASCollectionGalleryLayoutItem.mm in Sources */ = {isa = PBXBuildFile; fileRef = E5775AFD1F13CF7400CAC9BC /* _ASCollectionGalleryLayoutItem.mm */; };
|
||||||
E5775B001F13D25400CAC9BC /* ASCollectionLayoutState+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = E5775AFF1F13D25400CAC9BC /* ASCollectionLayoutState+Private.h */; settings = {ATTRIBUTES = (Private, ); }; };
|
E5775B001F13D25400CAC9BC /* ASCollectionLayoutState+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = E5775AFF1F13D25400CAC9BC /* ASCollectionLayoutState+Private.h */; settings = {ATTRIBUTES = (Private, ); }; };
|
||||||
E5775B021F16759300CAC9BC /* ASCollectionLayoutCache.h in Headers */ = {isa = PBXBuildFile; fileRef = E5775B011F16759300CAC9BC /* ASCollectionLayoutCache.h */; settings = {ATTRIBUTES = (Private, ); }; };
|
E5775B021F16759300CAC9BC /* ASCollectionLayoutCache.h in Headers */ = {isa = PBXBuildFile; fileRef = E5775B011F16759300CAC9BC /* ASCollectionLayoutCache.h */; settings = {ATTRIBUTES = (Private, ); }; };
|
||||||
@ -458,7 +460,7 @@
|
|||||||
E5E281741E71C833006B67C2 /* ASCollectionLayoutState.h in Headers */ = {isa = PBXBuildFile; fileRef = E5E281731E71C833006B67C2 /* ASCollectionLayoutState.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
E5E281741E71C833006B67C2 /* ASCollectionLayoutState.h in Headers */ = {isa = PBXBuildFile; fileRef = E5E281731E71C833006B67C2 /* ASCollectionLayoutState.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
E5E281761E71C845006B67C2 /* ASCollectionLayoutState.mm in Sources */ = {isa = PBXBuildFile; fileRef = E5E281751E71C845006B67C2 /* ASCollectionLayoutState.mm */; };
|
E5E281761E71C845006B67C2 /* ASCollectionLayoutState.mm in Sources */ = {isa = PBXBuildFile; fileRef = E5E281751E71C845006B67C2 /* ASCollectionLayoutState.mm */; };
|
||||||
E5E2D72E1EA780C4005C24C6 /* ASCollectionGalleryLayoutDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = E5E2D72D1EA780C4005C24C6 /* ASCollectionGalleryLayoutDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
E5E2D72E1EA780C4005C24C6 /* ASCollectionGalleryLayoutDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = E5E2D72D1EA780C4005C24C6 /* ASCollectionGalleryLayoutDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
E5E2D7301EA780DF005C24C6 /* ASCollectionGalleryLayoutDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E5E2D72F1EA780DF005C24C6 /* ASCollectionGalleryLayoutDelegate.m */; };
|
E5E2D7301EA780DF005C24C6 /* ASCollectionGalleryLayoutDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = E5E2D72F1EA780DF005C24C6 /* ASCollectionGalleryLayoutDelegate.mm */; };
|
||||||
F711994E1D20C21100568860 /* ASDisplayNodeExtrasTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F711994D1D20C21100568860 /* ASDisplayNodeExtrasTests.m */; };
|
F711994E1D20C21100568860 /* ASDisplayNodeExtrasTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F711994D1D20C21100568860 /* ASDisplayNodeExtrasTests.m */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
@ -917,6 +919,8 @@
|
|||||||
E54E81FA1EB357BD00FFE8E1 /* ASPageTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASPageTable.h; sourceTree = "<group>"; };
|
E54E81FA1EB357BD00FFE8E1 /* ASPageTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASPageTable.h; sourceTree = "<group>"; };
|
||||||
E54E81FB1EB357BD00FFE8E1 /* ASPageTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASPageTable.m; sourceTree = "<group>"; };
|
E54E81FB1EB357BD00FFE8E1 /* ASPageTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASPageTable.m; sourceTree = "<group>"; };
|
||||||
E55D86311CA8A14000A0C26F /* ASLayoutElement.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASLayoutElement.mm; sourceTree = "<group>"; };
|
E55D86311CA8A14000A0C26F /* ASLayoutElement.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASLayoutElement.mm; sourceTree = "<group>"; };
|
||||||
|
E5667E8B1F33871300FA6FC0 /* _ASCollectionGalleryLayoutInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _ASCollectionGalleryLayoutInfo.h; sourceTree = "<group>"; };
|
||||||
|
E5667E8D1F33872700FA6FC0 /* _ASCollectionGalleryLayoutInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _ASCollectionGalleryLayoutInfo.m; sourceTree = "<group>"; };
|
||||||
E5711A2A1C840C81009619D4 /* ASCollectionElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASCollectionElement.h; sourceTree = "<group>"; };
|
E5711A2A1C840C81009619D4 /* ASCollectionElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASCollectionElement.h; sourceTree = "<group>"; };
|
||||||
E5711A2D1C840C96009619D4 /* ASCollectionElement.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASCollectionElement.mm; sourceTree = "<group>"; };
|
E5711A2D1C840C96009619D4 /* ASCollectionElement.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASCollectionElement.mm; sourceTree = "<group>"; };
|
||||||
E5775AFB1F13CE9F00CAC9BC /* _ASCollectionGalleryLayoutItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _ASCollectionGalleryLayoutItem.h; sourceTree = "<group>"; };
|
E5775AFB1F13CE9F00CAC9BC /* _ASCollectionGalleryLayoutItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _ASCollectionGalleryLayoutItem.h; sourceTree = "<group>"; };
|
||||||
@ -946,7 +950,7 @@
|
|||||||
E5E281731E71C833006B67C2 /* ASCollectionLayoutState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASCollectionLayoutState.h; sourceTree = "<group>"; };
|
E5E281731E71C833006B67C2 /* ASCollectionLayoutState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASCollectionLayoutState.h; sourceTree = "<group>"; };
|
||||||
E5E281751E71C845006B67C2 /* ASCollectionLayoutState.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASCollectionLayoutState.mm; sourceTree = "<group>"; };
|
E5E281751E71C845006B67C2 /* ASCollectionLayoutState.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASCollectionLayoutState.mm; sourceTree = "<group>"; };
|
||||||
E5E2D72D1EA780C4005C24C6 /* ASCollectionGalleryLayoutDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASCollectionGalleryLayoutDelegate.h; sourceTree = "<group>"; };
|
E5E2D72D1EA780C4005C24C6 /* ASCollectionGalleryLayoutDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASCollectionGalleryLayoutDelegate.h; sourceTree = "<group>"; };
|
||||||
E5E2D72F1EA780DF005C24C6 /* ASCollectionGalleryLayoutDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = ASCollectionGalleryLayoutDelegate.m; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
|
E5E2D72F1EA780DF005C24C6 /* ASCollectionGalleryLayoutDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = ASCollectionGalleryLayoutDelegate.mm; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
|
||||||
EFA731F0396842FF8AB635EE /* libPods-AsyncDisplayKitTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-AsyncDisplayKitTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
EFA731F0396842FF8AB635EE /* libPods-AsyncDisplayKitTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-AsyncDisplayKitTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
F711994D1D20C21100568860 /* ASDisplayNodeExtrasTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASDisplayNodeExtrasTests.m; sourceTree = "<group>"; };
|
F711994D1D20C21100568860 /* ASDisplayNodeExtrasTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASDisplayNodeExtrasTests.m; sourceTree = "<group>"; };
|
||||||
FB07EABBCF28656C6297BC2D /* Pods-AsyncDisplayKitTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AsyncDisplayKitTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AsyncDisplayKitTests/Pods-AsyncDisplayKitTests.debug.xcconfig"; sourceTree = "<group>"; };
|
FB07EABBCF28656C6297BC2D /* Pods-AsyncDisplayKitTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AsyncDisplayKitTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AsyncDisplayKitTests/Pods-AsyncDisplayKitTests.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
@ -1670,6 +1674,8 @@
|
|||||||
E5855DEE1EBB4D83003639AE /* ASCollectionLayoutDefines.h */,
|
E5855DEE1EBB4D83003639AE /* ASCollectionLayoutDefines.h */,
|
||||||
E5855DED1EBB4D83003639AE /* ASCollectionLayoutDefines.m */,
|
E5855DED1EBB4D83003639AE /* ASCollectionLayoutDefines.m */,
|
||||||
E5775AFF1F13D25400CAC9BC /* ASCollectionLayoutState+Private.h */,
|
E5775AFF1F13D25400CAC9BC /* ASCollectionLayoutState+Private.h */,
|
||||||
|
E5667E8B1F33871300FA6FC0 /* _ASCollectionGalleryLayoutInfo.h */,
|
||||||
|
E5667E8D1F33872700FA6FC0 /* _ASCollectionGalleryLayoutInfo.m */,
|
||||||
E5775AFB1F13CE9F00CAC9BC /* _ASCollectionGalleryLayoutItem.h */,
|
E5775AFB1F13CE9F00CAC9BC /* _ASCollectionGalleryLayoutItem.h */,
|
||||||
E5775AFD1F13CF7400CAC9BC /* _ASCollectionGalleryLayoutItem.mm */,
|
E5775AFD1F13CF7400CAC9BC /* _ASCollectionGalleryLayoutItem.mm */,
|
||||||
);
|
);
|
||||||
@ -1687,7 +1693,7 @@
|
|||||||
E58E9E3D1E941D74004CFC59 /* ASCollectionFlowLayoutDelegate.h */,
|
E58E9E3D1E941D74004CFC59 /* ASCollectionFlowLayoutDelegate.h */,
|
||||||
E58E9E3E1E941D74004CFC59 /* ASCollectionFlowLayoutDelegate.m */,
|
E58E9E3E1E941D74004CFC59 /* ASCollectionFlowLayoutDelegate.m */,
|
||||||
E5E2D72D1EA780C4005C24C6 /* ASCollectionGalleryLayoutDelegate.h */,
|
E5E2D72D1EA780C4005C24C6 /* ASCollectionGalleryLayoutDelegate.h */,
|
||||||
E5E2D72F1EA780DF005C24C6 /* ASCollectionGalleryLayoutDelegate.m */,
|
E5E2D72F1EA780DF005C24C6 /* ASCollectionGalleryLayoutDelegate.mm */,
|
||||||
E54E81FA1EB357BD00FFE8E1 /* ASPageTable.h */,
|
E54E81FA1EB357BD00FFE8E1 /* ASPageTable.h */,
|
||||||
E54E81FB1EB357BD00FFE8E1 /* ASPageTable.m */,
|
E54E81FB1EB357BD00FFE8E1 /* ASPageTable.m */,
|
||||||
);
|
);
|
||||||
@ -1824,6 +1830,8 @@
|
|||||||
CC87BB951DA8193C0090E380 /* ASCellNode+Internal.h in Headers */,
|
CC87BB951DA8193C0090E380 /* ASCellNode+Internal.h in Headers */,
|
||||||
E5775B021F16759300CAC9BC /* ASCollectionLayoutCache.h in Headers */,
|
E5775B021F16759300CAC9BC /* ASCollectionLayoutCache.h in Headers */,
|
||||||
E5775B001F13D25400CAC9BC /* ASCollectionLayoutState+Private.h in Headers */,
|
E5775B001F13D25400CAC9BC /* ASCollectionLayoutState+Private.h in Headers */,
|
||||||
|
E5667E8C1F33871300FA6FC0 /* _ASCollectionGalleryLayoutInfo.h in Headers */,
|
||||||
|
E5775AFC1F13CE9F00CAC9BC /* _ASCollectionGalleryLayoutItem.h in Headers */,
|
||||||
E5855DF01EBB4D83003639AE /* ASCollectionLayoutDefines.h in Headers */,
|
E5855DF01EBB4D83003639AE /* ASCollectionLayoutDefines.h in Headers */,
|
||||||
E5B5B9D11E9BAD9800A6B726 /* ASCollectionLayoutContext+Private.h in Headers */,
|
E5B5B9D11E9BAD9800A6B726 /* ASCollectionLayoutContext+Private.h in Headers */,
|
||||||
9C8898BD1C738BB800D6B02E /* ASTextKitFontSizeAdjuster.h in Headers */,
|
9C8898BD1C738BB800D6B02E /* ASTextKitFontSizeAdjuster.h in Headers */,
|
||||||
@ -1896,7 +1904,6 @@
|
|||||||
254C6B751BF94DF4003EC431 /* ASTextKitComponents.h in Headers */,
|
254C6B751BF94DF4003EC431 /* ASTextKitComponents.h in Headers */,
|
||||||
B35062081B010EFD0018CF92 /* ASScrollNode.h in Headers */,
|
B35062081B010EFD0018CF92 /* ASScrollNode.h in Headers */,
|
||||||
CCA282CC1E9EB73E0037E8B7 /* ASTipNode.h in Headers */,
|
CCA282CC1E9EB73E0037E8B7 /* ASTipNode.h in Headers */,
|
||||||
E5775AFC1F13CE9F00CAC9BC /* _ASCollectionGalleryLayoutItem.h in Headers */,
|
|
||||||
25E327571C16819500A2170C /* ASPagerNode.h in Headers */,
|
25E327571C16819500A2170C /* ASPagerNode.h in Headers */,
|
||||||
CCCCCCDB1EC3EF060087FE10 /* ASTextLine.h in Headers */,
|
CCCCCCDB1EC3EF060087FE10 /* ASTextLine.h in Headers */,
|
||||||
9C70F20E1CDBE9E5007D6C76 /* NSArray+Diffing.h in Headers */,
|
9C70F20E1CDBE9E5007D6C76 /* NSArray+Diffing.h in Headers */,
|
||||||
@ -2251,6 +2258,7 @@
|
|||||||
CCCCCCD61EC3EF060087FE10 /* ASTextDebugOption.m in Sources */,
|
CCCCCCD61EC3EF060087FE10 /* ASTextDebugOption.m in Sources */,
|
||||||
34EFC75C1B701BD200AD841F /* ASDimension.mm in Sources */,
|
34EFC75C1B701BD200AD841F /* ASDimension.mm in Sources */,
|
||||||
B350624E1B010EFD0018CF92 /* ASDisplayNode+AsyncDisplay.mm in Sources */,
|
B350624E1B010EFD0018CF92 /* ASDisplayNode+AsyncDisplay.mm in Sources */,
|
||||||
|
E5667E8E1F33872700FA6FC0 /* _ASCollectionGalleryLayoutInfo.m in Sources */,
|
||||||
25E327591C16819500A2170C /* ASPagerNode.m in Sources */,
|
25E327591C16819500A2170C /* ASPagerNode.m in Sources */,
|
||||||
636EA1A41C7FF4EC00EE152F /* NSArray+Diffing.m in Sources */,
|
636EA1A41C7FF4EC00EE152F /* NSArray+Diffing.m in Sources */,
|
||||||
B35062501B010EFD0018CF92 /* ASDisplayNode+DebugTiming.mm in Sources */,
|
B35062501B010EFD0018CF92 /* ASDisplayNode+DebugTiming.mm in Sources */,
|
||||||
@ -2286,7 +2294,7 @@
|
|||||||
CCCCCCE01EC3EF060087FE10 /* ASTextRunDelegate.m in Sources */,
|
CCCCCCE01EC3EF060087FE10 /* ASTextRunDelegate.m in Sources */,
|
||||||
CCCCCCDA1EC3EF060087FE10 /* ASTextLayout.m in Sources */,
|
CCCCCCDA1EC3EF060087FE10 /* ASTextLayout.m in Sources */,
|
||||||
254C6B841BF94F8A003EC431 /* ASTextNodeWordKerner.m in Sources */,
|
254C6B841BF94F8A003EC431 /* ASTextNodeWordKerner.m in Sources */,
|
||||||
E5E2D7301EA780DF005C24C6 /* ASCollectionGalleryLayoutDelegate.m in Sources */,
|
E5E2D7301EA780DF005C24C6 /* ASCollectionGalleryLayoutDelegate.mm in Sources */,
|
||||||
34EFC76B1B701CEB00AD841F /* ASLayoutSpec.mm in Sources */,
|
34EFC76B1B701CEB00AD841F /* ASLayoutSpec.mm in Sources */,
|
||||||
CC3B20861C3F76D600798563 /* ASPendingStateController.mm in Sources */,
|
CC3B20861C3F76D600798563 /* ASPendingStateController.mm in Sources */,
|
||||||
254C6B8C1BF94F8A003EC431 /* ASTextKitTailTruncater.mm in Sources */,
|
254C6B8C1BF94F8A003EC431 /* ASTextKitTailTruncater.mm in Sources */,
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
- [ASCollectionView] Add delegate bridging and index space translation for missing UICollectionViewLayout properties. [Scott Goodson](https://github.com/appleguy)
|
- [ASCollectionView] Add delegate bridging and index space translation for missing UICollectionViewLayout properties. [Scott Goodson](https://github.com/appleguy)
|
||||||
- [ASTextNode2] Add initial implementation for link handling. [Scott Goodson](https://github.com/appleguy) [#396](https://github.com/TextureGroup/Texture/pull/396)
|
- [ASTextNode2] Add initial implementation for link handling. [Scott Goodson](https://github.com/appleguy) [#396](https://github.com/TextureGroup/Texture/pull/396)
|
||||||
- [ASTextNode2] Provide compile flag to globally enable new implementation of ASTextNode: ASTEXTNODE_EXPERIMENT_GLOBAL_ENABLE. [Scott Goodson](https://github.com/appleguy) [#396](https://github.com/TextureGroup/Texture/pull/410)
|
- [ASTextNode2] Provide compile flag to globally enable new implementation of ASTextNode: ASTEXTNODE_EXPERIMENT_GLOBAL_ENABLE. [Scott Goodson](https://github.com/appleguy) [#396](https://github.com/TextureGroup/Texture/pull/410)
|
||||||
- Add ASCollectionGalleryLayoutDelegate - an async collection layout that makes same-size collections (e.g photo galleries, pagers, etc) fast and lightweight! [Huy Nguyen](https://github.com/nguyenhuy/) [#76](https://github.com/TextureGroup/Texture/pull/76) [#451](https://github.com/TextureGroup/Texture/pull/451)
|
- Add ASCollectionGalleryLayoutDelegate - an async collection layout that makes same-size collections (e.g photo galleries, pagers, etc) fast and lightweight! [Huy Nguyen](https://github.com/nguyenhuy/) [#76](https://github.com/TextureGroup/Texture/pull/76) [#451](https://github.com/TextureGroup/Texture/pull/451) [#496](https://github.com/TextureGroup/Texture/pull/496)
|
||||||
- Fix an issue that causes infinite layout loop in ASDisplayNode after [#428](https://github.com/TextureGroup/Texture/pull/428) [Huy Nguyen](https://github.com/nguyenhuy) [#455](https://github.com/TextureGroup/Texture/pull/455)
|
- Fix an issue that causes infinite layout loop in ASDisplayNode after [#428](https://github.com/TextureGroup/Texture/pull/428) [Huy Nguyen](https://github.com/nguyenhuy) [#455](https://github.com/TextureGroup/Texture/pull/455)
|
||||||
- Fix an issue in layout transition that causes it to unexpectedly use the old layout [Huy Nguyen](https://github.com/nguyenhuy) [#464](https://github.com/TextureGroup/Texture/pull/464)
|
- Fix an issue in layout transition that causes it to unexpectedly use the old layout [Huy Nguyen](https://github.com/nguyenhuy) [#464](https://github.com/TextureGroup/Texture/pull/464)
|
||||||
- Add -[ASDisplayNode detailedLayoutDescription] property to aid debugging. [Adlai Holler](https://github.com/Adlai-Holler) [#476](https://github.com/TextureGroup/Texture/pull/476)
|
- Add -[ASDisplayNode detailedLayoutDescription] property to aid debugging. [Adlai Holler](https://github.com/Adlai-Holler) [#476](https://github.com/TextureGroup/Texture/pull/476)
|
||||||
|
|||||||
@ -29,7 +29,7 @@
|
|||||||
#import <AsyncDisplayKit/ASCollectionView+Undeprecated.h>
|
#import <AsyncDisplayKit/ASCollectionView+Undeprecated.h>
|
||||||
#import <AsyncDisplayKit/UIResponder+AsyncDisplayKit.h>
|
#import <AsyncDisplayKit/UIResponder+AsyncDisplayKit.h>
|
||||||
|
|
||||||
@interface ASPagerNode () <ASCollectionDataSource, ASCollectionDelegate, ASCollectionDelegateFlowLayout, ASDelegateProxyInterceptor, ASCollectionGalleryLayoutSizeProviding>
|
@interface ASPagerNode () <ASCollectionDataSource, ASCollectionDelegate, ASCollectionDelegateFlowLayout, ASDelegateProxyInterceptor, ASCollectionGalleryLayoutPropertiesProviding>
|
||||||
{
|
{
|
||||||
__weak id <ASPagerDataSource> _pagerDataSource;
|
__weak id <ASPagerDataSource> _pagerDataSource;
|
||||||
ASPagerNodeProxy *_proxyDataSource;
|
ASPagerNodeProxy *_proxyDataSource;
|
||||||
@ -75,7 +75,7 @@
|
|||||||
ASCollectionGalleryLayoutDelegate *layoutDelegate = [[ASCollectionGalleryLayoutDelegate alloc] initWithScrollableDirections:ASScrollDirectionHorizontalDirections];
|
ASCollectionGalleryLayoutDelegate *layoutDelegate = [[ASCollectionGalleryLayoutDelegate alloc] initWithScrollableDirections:ASScrollDirectionHorizontalDirections];
|
||||||
self = [super initWithLayoutDelegate:layoutDelegate layoutFacilitator:nil];
|
self = [super initWithLayoutDelegate:layoutDelegate layoutFacilitator:nil];
|
||||||
if (self) {
|
if (self) {
|
||||||
layoutDelegate.sizeProvider = self;
|
layoutDelegate.propertiesProvider = self;
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
@ -137,7 +137,7 @@
|
|||||||
return indexPath.row;
|
return indexPath.row;
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - ASCollectionGalleryLayoutSizeProviding
|
#pragma mark - ASCollectionGalleryLayoutPropertiesProviding
|
||||||
|
|
||||||
- (CGSize)sizeForElements:(ASElementMap *)elements
|
- (CGSize)sizeForElements:(ASElementMap *)elements
|
||||||
{
|
{
|
||||||
|
|||||||
@ -76,8 +76,9 @@
|
|||||||
ASSizeRange sizeRange = ASSizeRangeForCollectionLayoutThatFitsViewportSize(context.viewportSize, context.scrollableDirections);
|
ASSizeRange sizeRange = ASSizeRangeForCollectionLayoutThatFitsViewportSize(context.viewportSize, context.scrollableDirections);
|
||||||
ASLayout *layout = [stackSpec layoutThatFits:sizeRange];
|
ASLayout *layout = [stackSpec layoutThatFits:sizeRange];
|
||||||
|
|
||||||
return [[ASCollectionLayoutState alloc] initWithContext:context layout:layout getElementBlock:^ASCollectionElement * _Nonnull(ASLayout * _Nonnull sublayout) {
|
return [[ASCollectionLayoutState alloc] initWithContext:context layout:layout getElementBlock:^ASCollectionElement * _Nullable(ASLayout * _Nonnull sublayout) {
|
||||||
return ((ASCellNode *)sublayout.layoutElement).collectionElement;
|
ASCellNode *node = ASDynamicCast(sublayout.layoutElement, ASCellNode);
|
||||||
|
return node ? node.collectionElement : nil;
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
@protocol ASCollectionGalleryLayoutSizeProviding <NSObject>
|
@protocol ASCollectionGalleryLayoutPropertiesProviding <NSObject>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the fixed size of each and every element.
|
* Returns the fixed size of each and every element.
|
||||||
@ -30,6 +30,51 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
*/
|
*/
|
||||||
- (CGSize)sizeForElements:(ASElementMap *)elements;
|
- (CGSize)sizeForElements:(ASElementMap *)elements;
|
||||||
|
|
||||||
|
@optional
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the minumum spacing to use between lines of items.
|
||||||
|
*
|
||||||
|
* @discussion This method will only be called on main thread.
|
||||||
|
*
|
||||||
|
* @discussion For a vertically scrolling layout, this value represents the minimum spacing between rows.
|
||||||
|
* For a horizontally scrolling one, it represents the minimum spacing between columns.
|
||||||
|
* It is not applied between the first line and the header, or between the last line and the footer.
|
||||||
|
* This is the same behavior as UICollectionViewFlowLayout's minimumLineSpacing.
|
||||||
|
*
|
||||||
|
* @param elements All elements in the layout.
|
||||||
|
*
|
||||||
|
* @return The interitem spacing
|
||||||
|
*/
|
||||||
|
- (CGFloat)minimumLineSpacingForElements:(ASElementMap *)elements;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the minumum spacing to use between items in the same row or column, depending on the scroll directions.
|
||||||
|
*
|
||||||
|
* @discussion This method will only be called on main thread.
|
||||||
|
*
|
||||||
|
* @discussion For a vertically scrolling layout, this value represents the minimum spacing between items in the same row.
|
||||||
|
* For a horizontally scrolling one, it represents the minimum spacing between items in the same column.
|
||||||
|
* It is considered while fitting items into lines, but the actual final spacing between some items might be larger.
|
||||||
|
* This is the same behavior as UICollectionViewFlowLayout's minimumInteritemSpacing.
|
||||||
|
*
|
||||||
|
* @param elements All elements in the layout.
|
||||||
|
*
|
||||||
|
* @return The interitem spacing
|
||||||
|
*/
|
||||||
|
- (CGFloat)minimumInteritemSpacingForElements:(ASElementMap *)elements;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the margins of each section.
|
||||||
|
*
|
||||||
|
* @discussion This method will only be called on main thread.
|
||||||
|
*
|
||||||
|
* @param elements All elements in the layout.
|
||||||
|
*
|
||||||
|
* @return The margins used to layout content in a section
|
||||||
|
*/
|
||||||
|
- (UIEdgeInsets)sectionInsetForElements:(ASElementMap *)elements;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -40,8 +85,13 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
AS_SUBCLASSING_RESTRICTED
|
AS_SUBCLASSING_RESTRICTED
|
||||||
@interface ASCollectionGalleryLayoutDelegate : NSObject <ASCollectionLayoutDelegate>
|
@interface ASCollectionGalleryLayoutDelegate : NSObject <ASCollectionLayoutDelegate>
|
||||||
|
|
||||||
@property (nonatomic, weak) id<ASCollectionGalleryLayoutSizeProviding> sizeProvider;
|
@property (nonatomic, weak) id<ASCollectionGalleryLayoutPropertiesProviding> propertiesProvider;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Designated initializer.
|
||||||
|
*
|
||||||
|
* @param scrollableDirections The scrollable directions of this layout. Must be either vertical or horizontal directions.
|
||||||
|
*/
|
||||||
- (instancetype)initWithScrollableDirections:(ASScrollDirection)scrollableDirections NS_DESIGNATED_INITIALIZER;
|
- (instancetype)initWithScrollableDirections:(ASScrollDirection)scrollableDirections NS_DESIGNATED_INITIALIZER;
|
||||||
|
|
||||||
- (instancetype)init __unavailable;
|
- (instancetype)init __unavailable;
|
||||||
|
|||||||
@ -1,93 +0,0 @@
|
|||||||
//
|
|
||||||
// ASCollectionGalleryLayoutDelegate.m
|
|
||||||
// Texture
|
|
||||||
//
|
|
||||||
// Copyright (c) 2017-present, Pinterest, Inc. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
|
|
||||||
#import <AsyncDisplayKit/ASCollectionGalleryLayoutDelegate.h>
|
|
||||||
|
|
||||||
#import <AsyncDisplayKit/_ASCollectionGalleryLayoutItem.h>
|
|
||||||
#import <AsyncDisplayKit/ASAssert.h>
|
|
||||||
#import <AsyncDisplayKit/ASCellNode.h>
|
|
||||||
#import <AsyncDisplayKit/ASCollectionElement.h>
|
|
||||||
#import <AsyncDisplayKit/ASCollectionLayoutContext.h>
|
|
||||||
#import <AsyncDisplayKit/ASCollectionLayoutDefines.h>
|
|
||||||
#import <AsyncDisplayKit/ASCollectionLayoutState.h>
|
|
||||||
#import <AsyncDisplayKit/ASElementMap.h>
|
|
||||||
#import <AsyncDisplayKit/ASLayout.h>
|
|
||||||
#import <AsyncDisplayKit/ASLayoutRangeType.h>
|
|
||||||
#import <AsyncDisplayKit/ASStackLayoutSpec.h>
|
|
||||||
|
|
||||||
#pragma mark - ASCollectionGalleryLayoutDelegate
|
|
||||||
|
|
||||||
@implementation ASCollectionGalleryLayoutDelegate {
|
|
||||||
ASScrollDirection _scrollableDirections;
|
|
||||||
CGSize _itemSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (instancetype)initWithScrollableDirections:(ASScrollDirection)scrollableDirections
|
|
||||||
{
|
|
||||||
self = [super init];
|
|
||||||
if (self) {
|
|
||||||
_scrollableDirections = scrollableDirections;
|
|
||||||
}
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (ASScrollDirection)scrollableDirections
|
|
||||||
{
|
|
||||||
ASDisplayNodeAssertMainThread();
|
|
||||||
return _scrollableDirections;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (id)additionalInfoForLayoutWithElements:(ASElementMap *)elements
|
|
||||||
{
|
|
||||||
ASDisplayNodeAssertMainThread();
|
|
||||||
if (_sizeProvider == nil) {
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
return [NSValue valueWithCGSize:[_sizeProvider sizeForElements:elements]];
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (ASCollectionLayoutState *)calculateLayoutWithContext:(ASCollectionLayoutContext *)context
|
|
||||||
{
|
|
||||||
ASElementMap *elements = context.elements;
|
|
||||||
CGSize pageSize = context.viewportSize;
|
|
||||||
ASScrollDirection scrollableDirections = context.scrollableDirections;
|
|
||||||
|
|
||||||
CGSize itemSize = context.additionalInfo ? ((NSValue *)context.additionalInfo).CGSizeValue : CGSizeZero;
|
|
||||||
if (CGSizeEqualToSize(CGSizeZero, itemSize)) {
|
|
||||||
return [[ASCollectionLayoutState alloc] initWithContext:context];
|
|
||||||
}
|
|
||||||
|
|
||||||
NSMutableArray<_ASGalleryLayoutItem *> *children = ASArrayByFlatMapping(elements.itemElements,
|
|
||||||
ASCollectionElement *element,
|
|
||||||
[[_ASGalleryLayoutItem alloc] initWithItemSize:itemSize collectionElement:element]);
|
|
||||||
if (children.count == 0) {
|
|
||||||
return [[ASCollectionLayoutState alloc] initWithContext:context];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use a stack spec to calculate layout content size and frames of all elements without actually measuring each element
|
|
||||||
ASStackLayoutSpec *stackSpec = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionHorizontal
|
|
||||||
spacing:0
|
|
||||||
justifyContent:ASStackLayoutJustifyContentStart
|
|
||||||
alignItems:ASStackLayoutAlignItemsStart
|
|
||||||
flexWrap:ASStackLayoutFlexWrapWrap
|
|
||||||
alignContent:ASStackLayoutAlignContentStart
|
|
||||||
children:children];
|
|
||||||
stackSpec.concurrent = YES;
|
|
||||||
ASLayout *layout = [stackSpec layoutThatFits:ASSizeRangeForCollectionLayoutThatFitsViewportSize(pageSize, scrollableDirections)];
|
|
||||||
|
|
||||||
return [[ASCollectionLayoutState alloc] initWithContext:context layout:layout getElementBlock:^ASCollectionElement *(ASLayout *sublayout) {
|
|
||||||
return ((_ASGalleryLayoutItem *)sublayout.layoutElement).collectionElement;
|
|
||||||
}];
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
140
Source/Details/ASCollectionGalleryLayoutDelegate.mm
Normal file
140
Source/Details/ASCollectionGalleryLayoutDelegate.mm
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
//
|
||||||
|
// ASCollectionGalleryLayoutDelegate.mm
|
||||||
|
// Texture
|
||||||
|
//
|
||||||
|
// Copyright (c) 2017-present, Pinterest, Inc. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <AsyncDisplayKit/ASCollectionGalleryLayoutDelegate.h>
|
||||||
|
|
||||||
|
#import <AsyncDisplayKit/_ASCollectionGalleryLayoutInfo.h>
|
||||||
|
#import <AsyncDisplayKit/_ASCollectionGalleryLayoutItem.h>
|
||||||
|
#import <AsyncDisplayKit/ASAssert.h>
|
||||||
|
#import <AsyncDisplayKit/ASCellNode.h>
|
||||||
|
#import <AsyncDisplayKit/ASCollectionElement.h>
|
||||||
|
#import <AsyncDisplayKit/ASCollectionLayoutContext.h>
|
||||||
|
#import <AsyncDisplayKit/ASCollectionLayoutDefines.h>
|
||||||
|
#import <AsyncDisplayKit/ASCollectionLayoutState.h>
|
||||||
|
#import <AsyncDisplayKit/ASElementMap.h>
|
||||||
|
#import <AsyncDisplayKit/ASLayout.h>
|
||||||
|
#import <AsyncDisplayKit/ASLayoutRangeType.h>
|
||||||
|
#import <AsyncDisplayKit/ASInsetLayoutSpec.h>
|
||||||
|
#import <AsyncDisplayKit/ASStackLayoutSpec.h>
|
||||||
|
|
||||||
|
#pragma mark - ASCollectionGalleryLayoutDelegate
|
||||||
|
|
||||||
|
@implementation ASCollectionGalleryLayoutDelegate {
|
||||||
|
ASScrollDirection _scrollableDirections;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
unsigned int minimumLineSpacingForElements:1;
|
||||||
|
unsigned int minimumInteritemSpacingForElements:1;
|
||||||
|
unsigned int sectionInsetForElements:1;
|
||||||
|
} _propertiesProviderFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (instancetype)initWithScrollableDirections:(ASScrollDirection)scrollableDirections
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self) {
|
||||||
|
// Scrollable directions must be either vertical or horizontal, but not both
|
||||||
|
ASDisplayNodeAssertTrue(ASScrollDirectionContainsVerticalDirection(scrollableDirections)
|
||||||
|
|| ASScrollDirectionContainsHorizontalDirection(scrollableDirections));
|
||||||
|
ASDisplayNodeAssertFalse(ASScrollDirectionContainsVerticalDirection(scrollableDirections)
|
||||||
|
&& ASScrollDirectionContainsHorizontalDirection(scrollableDirections));
|
||||||
|
_scrollableDirections = scrollableDirections;
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (ASScrollDirection)scrollableDirections
|
||||||
|
{
|
||||||
|
ASDisplayNodeAssertMainThread();
|
||||||
|
return _scrollableDirections;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setPropertiesProvider:(id<ASCollectionGalleryLayoutPropertiesProviding>)propertiesProvider
|
||||||
|
{
|
||||||
|
ASDisplayNodeAssertMainThread();
|
||||||
|
if (propertiesProvider == nil) {
|
||||||
|
_propertiesProvider = nil;
|
||||||
|
_propertiesProviderFlags = {};
|
||||||
|
} else {
|
||||||
|
_propertiesProvider = propertiesProvider;
|
||||||
|
_propertiesProviderFlags.minimumLineSpacingForElements = [_propertiesProvider respondsToSelector:@selector(minimumLineSpacingForElements:)];
|
||||||
|
_propertiesProviderFlags.minimumInteritemSpacingForElements = [_propertiesProvider respondsToSelector:@selector(minimumInteritemSpacingForElements:)];
|
||||||
|
_propertiesProviderFlags.sectionInsetForElements = [_propertiesProvider respondsToSelector:@selector(sectionInsetForElements:)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)additionalInfoForLayoutWithElements:(ASElementMap *)elements
|
||||||
|
{
|
||||||
|
ASDisplayNodeAssertMainThread();
|
||||||
|
id<ASCollectionGalleryLayoutPropertiesProviding> propertiesProvider = _propertiesProvider;
|
||||||
|
if (propertiesProvider == nil) {
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGSize itemSize = [propertiesProvider sizeForElements:elements];
|
||||||
|
UIEdgeInsets sectionInset = _propertiesProviderFlags.sectionInsetForElements ? [propertiesProvider sectionInsetForElements:elements] : UIEdgeInsetsZero;
|
||||||
|
CGFloat lineSpacing = _propertiesProviderFlags.minimumLineSpacingForElements ? [propertiesProvider minimumLineSpacingForElements:elements] : 0.0;
|
||||||
|
CGFloat interitemSpacing = _propertiesProviderFlags.minimumInteritemSpacingForElements ? [propertiesProvider minimumInteritemSpacingForElements:elements] : 0.0;
|
||||||
|
return [[_ASCollectionGalleryLayoutInfo alloc] initWithItemSize:itemSize
|
||||||
|
minimumLineSpacing:lineSpacing
|
||||||
|
minimumInteritemSpacing:interitemSpacing
|
||||||
|
sectionInset:sectionInset];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (ASCollectionLayoutState *)calculateLayoutWithContext:(ASCollectionLayoutContext *)context
|
||||||
|
{
|
||||||
|
ASElementMap *elements = context.elements;
|
||||||
|
CGSize pageSize = context.viewportSize;
|
||||||
|
ASScrollDirection scrollableDirections = context.scrollableDirections;
|
||||||
|
|
||||||
|
_ASCollectionGalleryLayoutInfo *info = ASDynamicCast(context.additionalInfo, _ASCollectionGalleryLayoutInfo);
|
||||||
|
CGSize itemSize = info.itemSize;
|
||||||
|
if (info == nil || CGSizeEqualToSize(CGSizeZero, itemSize)) {
|
||||||
|
return [[ASCollectionLayoutState alloc] initWithContext:context];
|
||||||
|
}
|
||||||
|
|
||||||
|
NSMutableArray<_ASGalleryLayoutItem *> *children = ASArrayByFlatMapping(elements.itemElements,
|
||||||
|
ASCollectionElement *element,
|
||||||
|
[[_ASGalleryLayoutItem alloc] initWithItemSize:itemSize collectionElement:element]);
|
||||||
|
if (children.count == 0) {
|
||||||
|
return [[ASCollectionLayoutState alloc] initWithContext:context];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use a stack spec to calculate layout content size and frames of all elements without actually measuring each element
|
||||||
|
ASStackLayoutDirection stackDirection = ASScrollDirectionContainsVerticalDirection(scrollableDirections)
|
||||||
|
? ASStackLayoutDirectionHorizontal
|
||||||
|
: ASStackLayoutDirectionVertical;
|
||||||
|
ASStackLayoutSpec *stackSpec = [ASStackLayoutSpec stackLayoutSpecWithDirection:stackDirection
|
||||||
|
spacing:info.minimumInteritemSpacing
|
||||||
|
justifyContent:ASStackLayoutJustifyContentStart
|
||||||
|
alignItems:ASStackLayoutAlignItemsStart
|
||||||
|
flexWrap:ASStackLayoutFlexWrapWrap
|
||||||
|
alignContent:ASStackLayoutAlignContentStart
|
||||||
|
lineSpacing:info.minimumLineSpacing
|
||||||
|
children:children];
|
||||||
|
stackSpec.concurrent = YES;
|
||||||
|
|
||||||
|
ASLayoutSpec *finalSpec = stackSpec;
|
||||||
|
UIEdgeInsets sectionInset = info.sectionInset;
|
||||||
|
if (UIEdgeInsetsEqualToEdgeInsets(sectionInset, UIEdgeInsetsZero) == NO) {
|
||||||
|
finalSpec = [ASInsetLayoutSpec insetLayoutSpecWithInsets:sectionInset child:stackSpec];
|
||||||
|
}
|
||||||
|
|
||||||
|
ASLayout *layout = [finalSpec layoutThatFits:ASSizeRangeForCollectionLayoutThatFitsViewportSize(pageSize, scrollableDirections)];
|
||||||
|
|
||||||
|
return [[ASCollectionLayoutState alloc] initWithContext:context layout:layout getElementBlock:^ASCollectionElement * _Nullable(ASLayout * _Nonnull sublayout) {
|
||||||
|
_ASGalleryLayoutItem *item = ASDynamicCast(sublayout.layoutElement, _ASGalleryLayoutItem);
|
||||||
|
return item ? item.collectionElement : nil;
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
@ -23,6 +23,8 @@
|
|||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
typedef ASCollectionElement * _Nullable (^ASCollectionLayoutStateGetElementBlock)(ASLayout *);
|
||||||
|
|
||||||
@interface NSMapTable (ASCollectionLayoutConvenience)
|
@interface NSMapTable (ASCollectionLayoutConvenience)
|
||||||
|
|
||||||
+ (NSMapTable<ASCollectionElement *, UICollectionViewLayoutAttributes *> *)elementToLayoutAttributesTable;
|
+ (NSMapTable<ASCollectionElement *, UICollectionViewLayoutAttributes *> *)elementToLayoutAttributesTable;
|
||||||
@ -70,11 +72,11 @@ AS_SUBCLASSING_RESTRICTED
|
|||||||
*
|
*
|
||||||
* @param layout The layout describes size and position of all elements.
|
* @param layout The layout describes size and position of all elements.
|
||||||
*
|
*
|
||||||
* @param getElementBlock A block that can retrieve the collection element from a direct sublayout of the root layout.
|
* @param getElementBlock A block that can retrieve the collection element from a sublayout of the root layout.
|
||||||
*/
|
*/
|
||||||
- (instancetype)initWithContext:(ASCollectionLayoutContext *)context
|
- (instancetype)initWithContext:(ASCollectionLayoutContext *)context
|
||||||
layout:(ASLayout *)layout
|
layout:(ASLayout *)layout
|
||||||
getElementBlock:(ASCollectionElement *(^)(ASLayout *))getElementBlock;
|
getElementBlock:(ASCollectionLayoutStateGetElementBlock)getElementBlock;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns all layout attributes present in this object.
|
* Returns all layout attributes present in this object.
|
||||||
|
|||||||
@ -20,9 +20,12 @@
|
|||||||
#import <AsyncDisplayKit/ASDisplayNode+Subclasses.h>
|
#import <AsyncDisplayKit/ASDisplayNode+Subclasses.h>
|
||||||
#import <AsyncDisplayKit/ASElementMap.h>
|
#import <AsyncDisplayKit/ASElementMap.h>
|
||||||
#import <AsyncDisplayKit/ASLayout.h>
|
#import <AsyncDisplayKit/ASLayout.h>
|
||||||
|
#import <AsyncDisplayKit/ASLayoutSpecUtilities.h>
|
||||||
#import <AsyncDisplayKit/ASPageTable.h>
|
#import <AsyncDisplayKit/ASPageTable.h>
|
||||||
#import <AsyncDisplayKit/ASThread.h>
|
#import <AsyncDisplayKit/ASThread.h>
|
||||||
|
|
||||||
|
#import <queue>
|
||||||
|
|
||||||
@implementation NSMapTable (ASCollectionLayoutConvenience)
|
@implementation NSMapTable (ASCollectionLayoutConvenience)
|
||||||
|
|
||||||
+ (NSMapTable<ASCollectionElement *, UICollectionViewLayoutAttributes *> *)elementToLayoutAttributesTable
|
+ (NSMapTable<ASCollectionElement *, UICollectionViewLayoutAttributes *> *)elementToLayoutAttributesTable
|
||||||
@ -48,30 +51,49 @@ elementToLayoutAttributesTable:[NSMapTable elementToLayoutAttributesTable]];
|
|||||||
|
|
||||||
- (instancetype)initWithContext:(ASCollectionLayoutContext *)context
|
- (instancetype)initWithContext:(ASCollectionLayoutContext *)context
|
||||||
layout:(ASLayout *)layout
|
layout:(ASLayout *)layout
|
||||||
getElementBlock:(ASCollectionElement *(^)(ASLayout *))getElementBlock
|
getElementBlock:(ASCollectionLayoutStateGetElementBlock)getElementBlock
|
||||||
{
|
{
|
||||||
ASElementMap *elements = context.elements;
|
ASElementMap *elements = context.elements;
|
||||||
NSMapTable *table = [NSMapTable elementToLayoutAttributesTable];
|
NSMapTable *table = [NSMapTable elementToLayoutAttributesTable];
|
||||||
|
|
||||||
for (ASLayout *sublayout in layout.sublayouts) {
|
// Traverse the given layout tree in breadth first fashion. Generate layout attributes for all included elements along the way.
|
||||||
ASCollectionElement *element = getElementBlock(sublayout);
|
struct Context {
|
||||||
if (element == nil) {
|
ASLayout *layout;
|
||||||
ASDisplayNodeFailAssert(@"Element not found!");
|
CGPoint absolutePosition;
|
||||||
continue;
|
};
|
||||||
|
|
||||||
|
std::queue<Context> queue;
|
||||||
|
queue.push({layout, CGPointZero});
|
||||||
|
|
||||||
|
while (!queue.empty()) {
|
||||||
|
Context context = queue.front();
|
||||||
|
queue.pop();
|
||||||
|
|
||||||
|
ASLayout *layout = context.layout;
|
||||||
|
const CGPoint absolutePosition = context.absolutePosition;
|
||||||
|
|
||||||
|
ASCollectionElement *element = getElementBlock(layout);
|
||||||
|
if (element != nil) {
|
||||||
|
NSIndexPath *indexPath = [elements indexPathForElement:element];
|
||||||
|
NSString *supplementaryElementKind = element.supplementaryElementKind;
|
||||||
|
|
||||||
|
UICollectionViewLayoutAttributes *attrs;
|
||||||
|
if (supplementaryElementKind == nil) {
|
||||||
|
attrs = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
|
||||||
|
} else {
|
||||||
|
attrs = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:supplementaryElementKind withIndexPath:indexPath];
|
||||||
|
}
|
||||||
|
|
||||||
|
CGRect frame = layout.frame;
|
||||||
|
frame.origin = absolutePosition;
|
||||||
|
attrs.frame = frame;
|
||||||
|
[table setObject:attrs forKey:element];
|
||||||
}
|
}
|
||||||
|
|
||||||
NSIndexPath *indexPath = [elements indexPathForElement:element];
|
// Add all sublayouts to process in next step
|
||||||
NSString *supplementaryElementKind = element.supplementaryElementKind;
|
for (ASLayout *sublayout in layout.sublayouts) {
|
||||||
|
queue.push({sublayout, absolutePosition + sublayout.position});
|
||||||
UICollectionViewLayoutAttributes *attrs;
|
|
||||||
if (supplementaryElementKind == nil) {
|
|
||||||
attrs = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
|
|
||||||
} else {
|
|
||||||
attrs = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:supplementaryElementKind withIndexPath:indexPath];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
attrs.frame = sublayout.frame;
|
|
||||||
[table setObject:attrs forKey:element];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return [self initWithContext:context contentSize:layout.size elementToLayoutAttributesTable:table];
|
return [self initWithContext:context contentSize:layout.size elementToLayoutAttributesTable:table];
|
||||||
|
|||||||
@ -258,7 +258,7 @@ static std::atomic_bool static_retainsSublayoutLayoutElements = ATOMIC_VAR_INIT(
|
|||||||
} else if (sublayoutsCount > 0){
|
} else if (sublayoutsCount > 0){
|
||||||
std::vector<Context> sublayoutContexts;
|
std::vector<Context> sublayoutContexts;
|
||||||
for (ASLayout *sublayout in sublayouts) {
|
for (ASLayout *sublayout in sublayouts) {
|
||||||
sublayoutContexts.push_back({sublayout, context.absolutePosition + sublayout.position});
|
sublayoutContexts.push_back({sublayout, absolutePosition + sublayout.position});
|
||||||
}
|
}
|
||||||
queue.insert(queue.cbegin(), sublayoutContexts.begin(), sublayoutContexts.end());
|
queue.insert(queue.cbegin(), sublayoutContexts.begin(), sublayoutContexts.end());
|
||||||
}
|
}
|
||||||
|
|||||||
30
Source/Private/_ASCollectionGalleryLayoutInfo.h
Normal file
30
Source/Private/_ASCollectionGalleryLayoutInfo.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
//
|
||||||
|
// _ASCollectionGalleryLayoutInfo.h
|
||||||
|
// Texture
|
||||||
|
//
|
||||||
|
// Copyright (c) 2017-present, Pinterest, Inc. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
@interface _ASCollectionGalleryLayoutInfo : NSObject
|
||||||
|
|
||||||
|
// Read-only properties
|
||||||
|
@property (nonatomic, assign, readonly) CGSize itemSize;
|
||||||
|
@property (nonatomic, assign, readonly) CGFloat minimumLineSpacing;
|
||||||
|
@property (nonatomic, assign, readonly) CGFloat minimumInteritemSpacing;
|
||||||
|
@property (nonatomic, assign, readonly) UIEdgeInsets sectionInset;
|
||||||
|
|
||||||
|
- (instancetype)initWithItemSize:(CGSize)itemSize
|
||||||
|
minimumLineSpacing:(CGFloat)minimumLineSpacing
|
||||||
|
minimumInteritemSpacing:(CGFloat)minimumInteritemSpacing
|
||||||
|
sectionInset:(UIEdgeInsets)sectionInset NS_DESIGNATED_INITIALIZER;
|
||||||
|
|
||||||
|
- (instancetype)init __unavailable;
|
||||||
|
|
||||||
|
@end
|
||||||
72
Source/Private/_ASCollectionGalleryLayoutInfo.m
Normal file
72
Source/Private/_ASCollectionGalleryLayoutInfo.m
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
//
|
||||||
|
// _ASCollectionGalleryLayoutInfo.m
|
||||||
|
// Texture
|
||||||
|
//
|
||||||
|
// Copyright (c) 2017-present, Pinterest, Inc. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <AsyncDisplayKit/_ASCollectionGalleryLayoutInfo.h>
|
||||||
|
#import <AsyncDisplayKit/ASHashing.h>
|
||||||
|
|
||||||
|
@implementation _ASCollectionGalleryLayoutInfo
|
||||||
|
|
||||||
|
- (instancetype)initWithItemSize:(CGSize)itemSize
|
||||||
|
minimumLineSpacing:(CGFloat)minimumLineSpacing
|
||||||
|
minimumInteritemSpacing:(CGFloat)minimumInteritemSpacing
|
||||||
|
sectionInset:(UIEdgeInsets)sectionInset
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self) {
|
||||||
|
_itemSize = itemSize;
|
||||||
|
_minimumLineSpacing = minimumLineSpacing;
|
||||||
|
_minimumInteritemSpacing = minimumInteritemSpacing;
|
||||||
|
_sectionInset = sectionInset;
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)isEqualToInfo:(_ASCollectionGalleryLayoutInfo *)info
|
||||||
|
{
|
||||||
|
if (info == nil) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CGSizeEqualToSize(_itemSize, info.itemSize)
|
||||||
|
&& _minimumLineSpacing == info.minimumLineSpacing
|
||||||
|
&& _minimumInteritemSpacing == info.minimumInteritemSpacing
|
||||||
|
&& UIEdgeInsetsEqualToEdgeInsets(_sectionInset, info.sectionInset);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)isEqual:(id)other
|
||||||
|
{
|
||||||
|
if (self == other) {
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
if (! [other isKindOfClass:[_ASCollectionGalleryLayoutInfo class]]) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
return [self isEqualToInfo:other];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSUInteger)hash
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
CGSize itemSize;
|
||||||
|
CGFloat minimumLineSpacing;
|
||||||
|
CGFloat minimumInteritemSpacing;
|
||||||
|
UIEdgeInsets sectionInset;
|
||||||
|
} data = {
|
||||||
|
_itemSize,
|
||||||
|
_minimumLineSpacing,
|
||||||
|
_minimumInteritemSpacing,
|
||||||
|
_sectionInset,
|
||||||
|
};
|
||||||
|
return ASHashBytes(&data, sizeof(data));
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
#define ASYNC_COLLECTION_LAYOUT 0
|
#define ASYNC_COLLECTION_LAYOUT 0
|
||||||
|
|
||||||
@interface ViewController () <ASCollectionDataSource, ASCollectionDelegateFlowLayout, ASCollectionGalleryLayoutSizeProviding>
|
@interface ViewController () <ASCollectionDataSource, ASCollectionDelegateFlowLayout, ASCollectionGalleryLayoutPropertiesProviding>
|
||||||
|
|
||||||
@property (nonatomic, strong) ASCollectionNode *collectionNode;
|
@property (nonatomic, strong) ASCollectionNode *collectionNode;
|
||||||
@property (nonatomic, strong) NSArray *data;
|
@property (nonatomic, strong) NSArray *data;
|
||||||
@ -48,7 +48,7 @@
|
|||||||
|
|
||||||
#if ASYNC_COLLECTION_LAYOUT
|
#if ASYNC_COLLECTION_LAYOUT
|
||||||
ASCollectionGalleryLayoutDelegate *layoutDelegate = [[ASCollectionGalleryLayoutDelegate alloc] initWithScrollableDirections:ASScrollDirectionVerticalDirections];
|
ASCollectionGalleryLayoutDelegate *layoutDelegate = [[ASCollectionGalleryLayoutDelegate alloc] initWithScrollableDirections:ASScrollDirectionVerticalDirections];
|
||||||
layoutDelegate.sizeProvider = self;
|
layoutDelegate.propertiesProvider = self;
|
||||||
self.collectionNode = [[ASCollectionNode alloc] initWithLayoutDelegate:layoutDelegate layoutFacilitator:nil];
|
self.collectionNode = [[ASCollectionNode alloc] initWithLayoutDelegate:layoutDelegate layoutFacilitator:nil];
|
||||||
#else
|
#else
|
||||||
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
|
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
|
||||||
@ -108,7 +108,7 @@
|
|||||||
[self.collectionNode reloadData];
|
[self.collectionNode reloadData];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - ASCollectionGalleryLayoutSizeProviding
|
#pragma mark - ASCollectionGalleryLayoutPropertiesProviding
|
||||||
|
|
||||||
- (CGSize)sizeForElements:(ASElementMap *)elements
|
- (CGSize)sizeForElements:(ASElementMap *)elements
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user