我在UITableview
中有幾個單元,每個單元都有自己的UIScrollView
。當用戶滾動其中一個單元格時,我希望所有其他單元格都遵循。有沒有辦法通過將contentOffset
傳遞給其他單元來創建這種交互?如何讓多個UITableViewCells相互溝通/互動?
我在想代表團,但到目前爲止我無法讓這個工作。有任何想法嗎?
我在UITableview
中有幾個單元,每個單元都有自己的UIScrollView
。當用戶滾動其中一個單元格時,我希望所有其他單元格都遵循。有沒有辦法通過將contentOffset
傳遞給其他單元來創建這種交互?如何讓多個UITableViewCells相互溝通/互動?
我在想代表團,但到目前爲止我無法讓這個工作。有任何想法嗎?
這其實很簡單。只需在您的viewController中實現UIScrollViewDelegate方法scrollViewDidScroll:
並在那裏設置所有其他單元格的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;
}
}
編輯: 你可以轉發委託回調到細胞,就像這樣:
for (MyFancyCell *cell in [self.tableView visibleCells]) {
cell.scrollView.contentOffset = contentOffset;
[cell scrollViewDidScroll:cell.scrollView];
}
或恕我直言,更好的辦法。使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
}
您可以同步cellForRowAtIndexPath
委託方法中的單元格。對於任何一個單元格的更改,您可以調用tableView的reloadData
,或通過調用reloadRowsAtIndexPath
方法重新加載僅選定的單元格。
代表團將是完美的。您可以將內容偏移量傳遞給每個表視圖,並讓它們全部成爲彼此的代表(請記住,.h中的#importing有時會創建無限循環,因此只需在.m文件中創建類別並執行#importing那裏)。
這個工作,唯一的問題是,我也需要使UITableViewCell成爲滾動視圖的委託。我知道一個對象不能有2個委託,所以你會建議再次調用每個* cell的委託方法*雖然我的viewController? – spiralstairs 2012-03-05 04:52:07
我做了一個編輯以顯示兩種可能的方式。第二種方法可能更清潔,因爲您不必將所有委託方法轉發給單元格。 – 2012-03-05 12:06:17
謝謝!它完美解決了。 – spiralstairs 2012-03-11 18:36:05