Это на самом деле довольно просто. Просто реализуйте метод UIScrollViewDelegate scrollViewDidScroll:
в вашем viewController и там вы устанавливаете 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;
}
}
EDIT:
Вы можете переадресовать вызовы делегатов обратно в ячейку, например так:
for (MyFancyCell *cell in [self.tableView visibleCells]) {
cell.scrollView.contentOffset = contentOffset;
[cell scrollViewDidScroll:cell.scrollView];
}
или imho лучше. Сделайте 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
}