Это на самом деле довольно просто. Просто введите UIScrollViewDelegate метод scrollViewDidScroll:
в свой viewController и там вы установите contentOffset всех других ячеек. Сделайте свой viewController делегатом прокрутки в каждой ячейке, и все готово.
- (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
}
Это работает, единственная проблема заключается в том, что мне также необходимо сделать UITableViewCell делегатом прокрутки. Я знаю, что у объекта не может быть 2 делегата, поэтому бы вы порекомендовали вызывать метод делегата снова на каждой * ячейке *, хотя мой viewController? – spiralstairs
Я сделал редактирование, чтобы показать два возможных способа. Второй способ, вероятно, более чист, потому что вам не нужно пересылать все методы делегата в ячейку. –
Спасибо! Это получилось отлично. – spiralstairs