私はUITableview
にいくつかの細胞を持っていて、それぞれがそれ自身のUIScrollView
を持っています。ユーザーがセルの1つをスクロールすると、他のすべてのセルがフォローされます。 contentOffset
を他のセルに渡すことで、この種の相互作用を作成する方法はありますか?複数のUITableViewCellを互いに通信/相互作用させる方法
私は代表団だと思っていますが、これまではこれを動作させることができません。何か案は?
私はUITableview
にいくつかの細胞を持っていて、それぞれがそれ自身のUIScrollView
を持っています。ユーザーがセルの1つをスクロールすると、他のすべてのセルがフォローされます。 contentOffset
を他のセルに渡すことで、この種の相互作用を作成する方法はありますか?複数のUITableViewCellを互いに通信/相互作用させる方法
私は代表団だと思っていますが、これまではこれを動作させることができません。何か案は?
これは実際には非常に簡単です。あなたの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
}
cellForRowAtIndexPath
デリゲートメソッドでセル間で同期をとることができます。 1つのセルの変更がある場合は、reloadData
をtableViewに呼び出すか、reloadRowsAtIndexPath
メソッドを呼び出して選択したセルのみをリロードします。
委任は完璧です。あなたは、すべてのテーブルビューにコンテンツオフセットを渡して、それらをすべてお互いの代理人にすることができます(覚えておいて、.hの#importingは無限ループを作成することがあるので、.mファイルにカテゴリを作成して#importingそこ)。
これはうまくいきますが、唯一の問題は、私もUITableViewCellをスクロールビューのデリゲートにする必要があることです。私は、オブジェクトが2つのデリゲートを持つことができないことを知っているので、私のviewControllerでも各セル*でデリゲートメソッドを再度呼び出すことをお勧めしますか? – spiralstairs
私は2つの可能な方法を示すために編集を行いました。 2番目の方法は、すべてのデリゲートメソッドをセルに転送する必要がないため、おそらくクリーナーです。 –
ありがとう!それは完璧に機能しました。 – spiralstairs