2012-03-04 2 views
1

У меня есть несколько ячеек в UITableview, каждый со своими UIScrollView. Когда пользователь прокручивается в одной из ячеек, я хотел бы, чтобы все остальные ячейки следовали. Есть ли способ создать такое взаимодействие, передав contentOffset другим ячейкам?Как заставить несколько UITableViewCells взаимодействовать друг с другом?

Я думаю о делегировании, но до сих пор я не могу заставить это работать. Есть идеи?

ответ

2

Это на самом деле довольно просто. Просто введите 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 
} 
+0

Это работает, единственная проблема заключается в том, что мне также необходимо сделать UITableViewCell делегатом прокрутки. Я знаю, что у объекта не может быть 2 делегата, поэтому бы вы порекомендовали вызывать метод делегата снова на каждой * ячейке *, хотя мой viewController? – spiralstairs

+0

Я сделал редактирование, чтобы показать два возможных способа. Второй способ, вероятно, более чист, потому что вам не нужно пересылать все методы делегата в ячейку. –

+0

Спасибо! Это получилось отлично. – spiralstairs

0

Вы можете синхронизировать между ячейками в методе делегата cellForRowAtIndexPath. Для любых изменений в одной ячейке вы можете вызвать reloadData таблицыView или перезагрузить только выбранные ячейки, вызвав метод reloadRowsAtIndexPath.

0

Делегация будет идеальной. Вы можете передать смещение содержимого для каждого вида таблицы и дать им все быть делегатами друг друга (помните, что #importing в .h иногда создает бесконечный цикл, поэтому просто создавайте категории в файле .m и делайте свой #importing там).