我有UIViewController
能够通过UICollectionView
(cv)或UITableView
(电视)显示其内容。
两个视图都通过故事板添加到视图层次结构中,我只是隐藏了一个不应该显示的视图。 UICollectionView
和UITableView
都具有相同的数据源。
UICollectionView
显示每行两个项目中的内容,UITableView
显然是每行一个项目。
所以我想要发生的是,如果用户决定在视图之间切换,新显示的视图应该滚动到另一个视图中可见的元素。
我做了一些scrollToRowAtIndexPath:atScrollPosition:animated:
和scrollToItemAtIndexPath:atScrollPosition:animated:
的试验但没有成功。
我理解,UICollectionView
和UITableView
都能够返回其当前可见项'/ rows'indexPaths,但是我如何将这些indexPath转换为另一个视图的indexPath并告诉他们滚动到那个元素?
我当前对开关按钮的触摸事件处理如下所示:
- (IBAction)switchView:(id)sender {
self.showListView = !self.showListView;
UIView *fromView, *toView;
NSIndexPath *indexPath;
if (self.showListView)
{
fromView = self.ArticleCollection;
toView = self.ArticleList;
CGRect visibleRect = (CGRect){.origin = self.ArticleCollection.contentOffset, .size = self.ArticleCollection.bounds.size};
CGPoint visiblePoint = CGPointMake(100, CGRectGetMidY(visibleRect));
indexPath = [self.ArticleCollection indexPathForItemAtPoint:visiblePoint];
}
else
{
fromView = self.ArticleList;
toView = self.ArticleCollection;
CGRect visibleRect = (CGRect){.origin = self.ArticleList.contentOffset, .size = self.ArticleList.bounds.size};
CGPoint visiblePoint = CGPointMake(100, CGRectGetMidY(visibleRect));
indexPath = [self.ArticleList indexPathForRowAtPoint:visiblePoint];
}
NSInteger row = indexPath.row;
if (self.showListView) {
[self.ArticleList scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:row*2 inSection:0]
atScrollPosition:UITableViewScrollPositionTop
animated:NO];
} else {
[self.ArticleCollection scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:ceil(row/2)
inSection:0
atScrollPosition:UICollectionViewScrollPositionCenteredVertically
animated:NO]];
}
// Here a transitionFromView:ToView:duration:options:completion call follows
}
提前感谢您对我的问题的任何贡献。
答案 0 :(得分:0)
来自 scrollToItemAtIndexPath:atScrollPosition:animated:电话中的一个小错误:
[self.ArticleCollection scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:row
inSection:0]
atScrollPosition:UICollectionViewScrollPositionCenteredVertically
animated:NO];
我确实认为 indexPath.row 会包含不同的值,无论它来自cv的可见indexPath还是tv的可见indexPath,所以我通过乘以或计算新行除了2.但事实证明在两种情况下行都是相同的,所以我只需要在两种情况下都使用相同的值:
NSInteger row = indexPath.row;
if (self.showListView) {
[self.ArticleList scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:row inSection:0]
atScrollPosition:UITableViewScrollPositionTop
animated:NO];
} else {
[self.ArticleCollection scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:row
inSection:0]
atScrollPosition:UICollectionViewScrollPositionCenteredVertically
animated:NO];
}
很抱歉给您带来不便。