Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix inconsistent state caused in UICollectionViewLayout+InteractiveReordering. #1289

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Expand Up @@ -76,6 +76,8 @@ The changelog for `IGListKit`. Also see the [releases](https://github.com/instag

- Fixed binding section controllers failing to update their cells when the section controller's section changes. [Chrisna Aing](https://github.com/ccrazy88) [(#1144)](https://github.com/Instagram/IGListKit/pull/1144)

- Fixed a bug caused when applying interactive reordering on a single section item while dragging it through the last spot of the collection view and back to some (non-last) target position. [Ofir Gluzman](https://github.com/ofirgluzman) [#1289](https://github.com/Instagram/IGListKit/pull/1289)

3.2.0
-----

Expand Down
Expand Up @@ -93,6 +93,8 @@ - (nullable NSIndexPath *)updatedTargetForInteractivelyMovingItem:(NSIndexPath *
IGListSectionController *sourceSectionController = [adapter sectionControllerForSection:sourceSectionIndex];
IGListSectionController *destinationSectionController = [adapter sectionControllerForSection:destinationSectionIndex];

adapter.isLastInteractiveMoveToLastSectionIndex = NO;

// this is a reordering of sections themselves
if ([sourceSectionController numberOfItems] == 1
&& [destinationSectionController numberOfItems] == 1) {
Expand Down
30 changes: 30 additions & 0 deletions Tests/IGListAdapterTests.m
Expand Up @@ -1699,4 +1699,34 @@ - (void)test_whenItemsAreInteractivelyReorderedAcrossSections_thatIndexesRevertT
XCTAssertEqual(section1Objects[2], section1.sectionObject.objects[2]);
}

- (void)test_whenSingleItemInSectionIsInteractivelyReorderedThorughLastSpot_indexesUpdateCorrectly {
IGListTestAdapterReorderingDataSource *dataSource = [IGListTestAdapterReorderingDataSource new];
dataSource.objects = @[@0, @1, @2];
self.adapter.dataSource = dataSource;
self.adapter.moveDelegate = dataSource;

IGTestReorderableSection *section0 = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:0];
IGTestReorderableSection *section1 = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:1];
IGTestReorderableSection *section2 = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:2];
section0.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:@[@0]];
section0.isReorderable = YES;
section1.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:@[@0]];
section2.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:@[@0]];

[self.adapter performUpdatesAnimated:NO completion:nil];

NSIndexPath *fromIndexPath = [NSIndexPath indexPathForItem:0 inSection:0];
NSIndexPath *lastSpotIndexPath = [NSIndexPath indexPathForItem:1 inSection:2];
NSIndexPath *toIndexPath = [NSIndexPath indexPathForItem:1 inSection:1];

// move the first section item to the middle while simulating dragging to the last spot and back.
NSIndexPath *interpretedPath = [self interpretedIndexPathFromIndexPath:fromIndexPath toIndexPath:lastSpotIndexPath];
interpretedPath = [self interpretedIndexPathFromIndexPath:interpretedPath toIndexPath:toIndexPath];
[self.adapter collectionView:self.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:interpretedPath];

XCTAssertEqual(section0, [self.adapter sectionControllerForSection:1]);
XCTAssertEqual(section1, [self.adapter sectionControllerForSection:0]);
XCTAssertEqual(section2, [self.adapter sectionControllerForSection:2]);
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for adding tests!

@end