2012-03-04 3 views
1

UITableview에 여러 개의 셀이 있습니다. 각 셀은 각각 UIScrollView입니다. 사용자가 셀 중 하나에서 스크롤하면 다른 모든 셀을 따라 가고 싶습니다. contentOffset을 다른 셀에 전달하여 이러한 종류의 상호 작용을 생성 할 수있는 방법이 있습니까?여러 UITableViewCell을 서로주고주고 상호 작용하는 방법은 무엇입니까?

나는 위임을 생각하고 있지만 지금까지는이 일을 할 수 없습니다. 어떤 아이디어?

답변

2

이것은 실제로 매우 쉽습니다. 그냥 UIScrollViewDelegatescrollViewDidScroll: viewController에 구현하고 거기에 다른 모든 셀의 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; 
    } 
} 

편집 : 이 같은 대리자 다시 셀에 호출을 전달할 수 :

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

또는 이럴 더 좋은 방법. viewController를 셀의 대리자로 만들고 셀 내의 scrollViewDidScoll 메서드에서 delegate (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 명의 델리게이트를 가질 수 없다는 것을 안다. 따라서, 뷰 콘트롤러를 사용하여 각 셀 *에 위임 메소드를 다시 호출하는 것이 좋을까? – spiralstairs

+0

두 가지 방법으로 편집했습니다. 두 번째 방법은 셀에 모든 대리자 메서드를 전달할 필요가 없기 때문에 아마 더 깨끗합니다. –

+0

감사합니다. 그것은 완벽하게 작동했습니다. – spiralstairs

0

cellForRowAtIndexPath 대리자 메서드에서 셀간에 동기화 할 수 있습니다. 한 셀의 변경 내용이 있으면 reloadData (tableView)을 호출하거나 reloadRowsAtIndexPath 메서드를 호출하여 선택한 셀만 다시로드 할 수 있습니다.

0

위임은 완벽 할 것입니다. 모든 테이블 뷰에 내용 오프셋을 전달하고 서로 모두 대리인이 될 수 있습니다 (.h의 #importing은 무한 루프를 생성하기 때문에 .m 파일에 범주를 만들고 # import 그곳에).

관련 문제