gpt4 book ai didi

ios - UITableView with UICollectionView in row weird scroll in different rows at the same time

转载 作者:行者123 更新时间:2023-11-29 11:35:19 25 4
gpt4 key购买 nike

我们有一个UITableView,每一行都是一个UICollectionView,支持水平滚动,没有启用分页 .

我们已经注册了可重用的单元格,

    // Setup for VenueFilterTableViewCell
NSString * cellIdentifier = @"VenueFilterTableViewCell";
VenueFilterTableViewCell *tbCell = [self.tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (tbCell == nil) {
tbCell = [[VenueFilterTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:cellIdentifier];
tbCell.selectionStyle = UITableViewCellSelectionStyleNone;
}
// Method for inflate the UICollectionView in the row
[tbCell setVenues:venues
loading:NO
atLocation:self.definedLocation
forFilter:filter
withDelegate:self];
cell = tbCell;

当我在 UITableViewCellindexPath.row 0 处水平滚动 UICollectionView 行时,indexPath.row 3(最初在屏幕外)同时滚动。因此,如果在水平滚动后,快速向下滚动,您可以看到第 3 行和第 7 行......等等,同时滚动。

我在每个单元格中都有一个进度条,用于向用户提供他距离水平滚动结束多远的反馈,但是由于这种重用行为,涉及的每一行(0、3 和 7)都搞砸了对方的进步。

有什么建议吗?

更新

我在 UITableView 中添加了下一个事件,用于控制单元格何时离开屏幕并强制 UICollectionView 内部停止滚动。这提高了一点性能,但最终问题再次发生。

UITableViewController 中用于检测行何时超出屏幕的代码:

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
if ([tableView.indexPathsForVisibleRows indexOfObject:indexPath] == NSNotFound) {
// This indeed is an indexPath no longer visible
// Do something to this non-visible cell...
if ([cell isKindOfClass:[VenueFilterTableViewCell class]]) {
VenueFilterTableViewCell *tbCell = (VenueFilterTableViewCell *) cell;
[tbCell stopScrolling];
}
}
}

UITableViewCell中的代码与UICollectionView,在reload content中,除了恢复contentOffset外,还需要重新启用self.collectionView .scrollEnabled = YES;

- (void) stopScrolling {
self.collectionView.scrollEnabled = NO;
[self.collectionView setContentOffset:self.collectionView.contentOffset animated:NO];
}

最佳答案

我的第一个回答没有帮助。所以我已经修复了这个问题 很抱歉把它放在 swift 中你可以很容易地在 objc 中转换它

我已经用下面的代码实现了 willDisplayCell 和 endDispayCell

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
guard let cell = cell as? ScreenShotsCell else { return }
self.configureCell(for: indexPath, to: cell)
cell.collectionView.setContentOffset(cell.collectionView.contentOffset, animated: true)
cell.collectionViewOffset = storedOffsets[indexPath.row] ?? 0
}

//--------------------------------------------------------------------------------

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
guard let cell = cell as? ScreenShotsCell else { return }
storedOffsets[indexPath.row] = cell.collectionViewOffset
cell.collectionView.setContentOffset(cell.collectionView.contentOffset, animated: true)
}

主要的核心逻辑是cell.collectionView.setContentOffset 所以当它不可见时它会停止滚动所以它会解决因为重用单元而导致其他行的tableview滚动的问题

希望对你有帮助

关于ios - UITableView with UICollectionView in row weird scroll in different rows at the same time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49829867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com