Post

Replies

Boosts

Views

Activity

CollectionView Diffable Data Source scrolling unexpectedly
My app displays comments, and users can like these comments. The app uses a diffable data source, and when I click on the last row to like the comment, the collection view scrolls to the centre. Here is a video of the issue  https://streamable.com/9vijyx  (sorry about he music, my baby daughter was dancing) Here is some of my code that I think is relevant - you'll see by the comments that I have tried to fix this issue by storing the content offset but it feels VERY hacky. Any help would be greatly appreciated. &#9;&#9;&#9;&#9;self.datasource = UICollectionViewDiffableDataSource<Section, PostDetail>(collectionView: self.collectionView) { &#9;&#9;&#9;&#9;&#9;&#9;(collectionView: UICollectionView, indexPath: IndexPath, userComment: PostDetail) -> UICollectionViewCell? in &#9;&#9;&#9;&#9;&#9;&#9;guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: PostDetailCell.reuseIdentifier, for: indexPath) as? PostDetailCell else { fatalError("Cannot create cell")} &#9;&#9;&#9;&#9;&#9;&#9;cell.user = self.user &#9;&#9;&#9;&#9;&#9;&#9;cell.postDetail = userComment &#9;&#9;&#9;&#9;&#9;&#9;cell.likeCommentDelegate = self &#9;&#9;&#9;&#9;&#9;&#9;return cell &#9;&#9;&#9;&#9;} &#9;&#9;&#9;&#9;var snapshot = NSDiffableDataSourceSnapshot<Section, PostDetail>() &#9;&#9;&#9;&#9;snapshot.appendSections([.main]) &#9;&#9;&#9;&#9;snapshot.appendItems(self.userComments) &#9;&#9;&#9;&#9;self.datasource.apply(snapshot, animatingDifferences: true) &#9;&#9;} &#9;&#9;fileprivate func applySnapshot() { &#9;&#9;&#9;&#9;//Any updates to the snapshot, including likes, will &#9;&#9;&#9;&#9;//scroll the collectionView, but we want to stay on the cell &#9;&#9;&#9;&#9;// the user has liked, not scroll, so we store the offset. &#9;&#9;&#9;&#9;//This is then restored after all updates are complete. &#9;&#9;&#9;&#9;//let contentOffset = self.collectionView.contentOffset &#9;&#9;&#9;&#9;var snapshot = NSDiffableDataSourceSnapshot<Section, PostDetail>() &#9;&#9;&#9;&#9;snapshot.appendSections([.main]) &#9;&#9;&#9;&#9;snapshot.appendItems(self.userComments) &#9;&#9;&#9;&#9;self.datasource.apply(snapshot, animatingDifferences: true) &#9;&#9;&#9;&#9;//self.collectionView.contentOffset = contentOffset &#9;&#9;} &#9;&#9;func handleCommentLike(cell: PostDetailCell) { &#9;&#9;&#9;&#9;print("handle like comment") &#9;&#9;&#9;&#9;guard let indexPath = self.collectionView.indexPath(for: cell) else { return } &#9;&#9;&#9;&#9;if self.userComments[indexPath.row].like == nil { &#9;&#9;&#9;&#9;&#9;&#9;let userId = user.id &#9;&#9;&#9;&#9;&#9;&#9;let postId = feedItem.post.id &#9;&#9;&#9;&#9;&#9;&#9;let commentId = self.userComments[indexPath.row].comment.id &#9;&#9;&#9;&#9;&#9;&#9;let timestamp = Int(Date().timeIntervalSince1970) &#9;&#9;&#9;&#9;&#9;&#9;let commentLike = CommentLike(postId: postId, userId: userId, commentId: commentId, createdTimestamp: timestamp) &#9;&#9;&#9;&#9;&#9;&#9;self.viewModel.createLike(commentLike: commentLike) { result in &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;switch result { &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;case .success(let commentLike): &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;print("\(commentLike)") &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;// &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;self.userComments[indexPath.row].like = commentLike &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;self.applySnapshot() &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;case .failure(let error): &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;print("Error creating like: \(error)") &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;} &#9;&#9;&#9;&#9;&#9;&#9;} &#9;&#9;&#9;&#9;} else { &#9;&#9;&#9;&#9;&#9;&#9;guard let like = self.userComments[indexPath.row].like else { return } &#9;&#9;&#9;&#9;&#9;&#9;self.viewModel.un(commentLike: like) { result in &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;switch result { &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;case .success(let like): &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;print(like) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;self.userComments[indexPath.row].like = nil &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;self.applySnapshot() &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;case .failure(let error): &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;print(error) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;} &#9;&#9;&#9;&#9;&#9;&#9;} &#9;&#9;&#9;&#9;} &#9;&#9;}
1
0
1.3k
Nov ’20