我在UITableview
中有几个单元格,每个单元格都有自己的UIScrollView
。当用户滚动其中一个单元格时,我希望所有其他单元格都可以跟随。有没有办法通过将contentOffset
传递给其他单元格来创建这种交互?
我在想代表团,但到目前为止,我无法让这个工作。有什么想法吗?
答案 0 :(得分:2)
这实际上非常简单。只需在viewController中实现UIScrollViewDelegate方法scrollViewDidScroll:
,然后设置所有其他单元格的contentOffset。使viewController成为每个单元格中scrollview的委托,然后就完成了。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"MyFancyCell";
MyFancyCell *cell = (MyFancyCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.scrollView.delegate = self; // actually you would do this in the storyboard or inside (cell == nil) if you don't use storyboard
// configure cell
return cell;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (scrollView == self.tableView) {
// each tableView is a UIScrollView too.
// they will call this method which will lead to strange results if you change your cells scrollView.
// just ignore the scroll events of the tableView
return;
}
CGPoint contentOffset = scrollView.contentOffset;
for (MyFancyCell *cell in [self.tableView visibleCells]) {
cell.scrollView.contentOffset = contentOffset;
}
}
编辑: 您可以将委托调用转发回单元格,如下所示:
for (MyFancyCell *cell in [self.tableView visibleCells]) {
cell.scrollView.contentOffset = contentOffset;
[cell scrollViewDidScroll:cell.scrollView];
}
或更好的方式。使viewController成为单元格的委托,并在单元格内的scrollViewDidScoll方法中告诉委托(viewController)contentOffset已更改,以便视图控制器更新单元格。
// MyFancyCell.h
@protocol MyFancyCellDelegate
- (void)fancyCell:(MyFancyCell *)cell didChangeContentOffset:(CGPoint)offset;
@end
@property (weak, nonatomic) id <MyFancyCellDelegate> delegate;
// MyFancyCell.m
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
// do your work here
[self.delegate fancyCell:self didChangeContentOffset:scrollView.contentOffset];
}
// ViewController.m
- (void)fancyCell:(MyFancyCell *)cell didChangeContentOffset:(CGPoint)offset {
for (MyFancyCell *cell in [self.tableView visibleCells]) {
cell.scrollView.contentOffset = offset;
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"MyFancyCell";
MyFancyCell *cell = (MyFancyCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.delegate = self;
// configure
}
答案 1 :(得分:0)
您可以在cellForRowAtIndexPath
委托方法中的单元格之间进行同步。对于一个单元格中的任何更改,您可以调用tableView的reloadData
,或通过调用reloadRowsAtIndexPath
方法仅重新加载选定的单元格。
答案 2 :(得分:0)
代表团将是完美的。您可以将内容偏移量传递给每个表视图,并让它们都是彼此的委托(请记住,.h中的#importing有时会创建一个无限循环,所以只需在.m文件中创建类别并执行#importing有)。