2012-03-04 9 views
1

私はUITableviewにいくつかの細胞を持っていて、それぞれがそれ自身のUIScrollViewを持っています。ユーザーがセルの1つをスクロールすると、他のすべてのセルがフォローされます。 contentOffsetを他のセルに渡すことで、この種の相互作用を作成する方法はありますか?複数のUITableViewCellを互いに通信/相互作用させる方法

私は代表団だと思っていますが、これまではこれを動作させることができません。何か案は?

答えて

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; 
    } 
} 

EDIT: デリゲートはこのように、バックセルへの呼び出しを転送することができます:

for (MyFancyCell *cell in [self.tableView visibleCells]) { 
    cell.scrollView.contentOffset = contentOffset; 
    [cell scrollViewDidScroll:cell.scrollView]; 
} 

や私見良い方法。 viewControllerをセルのデリゲートにし、セル内のscrollViewDidScollメソッドで、デリゲート(viewController)にcontentOffsetが変更されたことを通知し、View Controllerがセルを更新するようにします。

// 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

私は2つの可能な方法を示すために編集を行いました。 2番目の方法は、すべてのデリゲートメソッドをセルに転送する必要がないため、おそらくクリーナーです。 –

+0

ありがとう!それは完璧に機能しました。 – spiralstairs

0

cellForRowAtIndexPathデリゲートメソッドでセル間で同期をとることができます。 1つのセルの変更がある場合は、reloadDataをtableViewに呼び出すか、reloadRowsAtIndexPathメソッドを呼び出して選択したセルのみをリロードします。

0

委任は完璧です。あなたは、すべてのテーブルビューにコンテンツオフセットを渡して、それらをすべてお互いの代理人にすることができます(覚えておいて、.hの#importingは無限ループを作成することがあるので、.mファイルにカテゴリを作成して#importingそこ)。

関連する問題