UITableview
에 여러 개의 셀이 있습니다. 각 셀은 각각 UIScrollView
입니다. 사용자가 셀 중 하나에서 스크롤하면 다른 모든 셀을 따라 가고 싶습니다. contentOffset
을 다른 셀에 전달하여 이러한 종류의 상호 작용을 생성 할 수있는 방법이 있습니까?여러 UITableViewCell을 서로주고주고 상호 작용하는 방법은 무엇입니까?
나는 위임을 생각하고 있지만 지금까지는이 일을 할 수 없습니다. 어떤 아이디어?
UITableview
에 여러 개의 셀이 있습니다. 각 셀은 각각 UIScrollView
입니다. 사용자가 셀 중 하나에서 스크롤하면 다른 모든 셀을 따라 가고 싶습니다. contentOffset
을 다른 셀에 전달하여 이러한 종류의 상호 작용을 생성 할 수있는 방법이 있습니까?여러 UITableViewCell을 서로주고주고 상호 작용하는 방법은 무엇입니까?
나는 위임을 생각하고 있지만 지금까지는이 일을 할 수 없습니다. 어떤 아이디어?
이것은 실제로 매우 쉽습니다. 그냥 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
}
cellForRowAtIndexPath
대리자 메서드에서 셀간에 동기화 할 수 있습니다. 한 셀의 변경 내용이 있으면 reloadData
(tableView)을 호출하거나 reloadRowsAtIndexPath
메서드를 호출하여 선택한 셀만 다시로드 할 수 있습니다.
위임은 완벽 할 것입니다. 모든 테이블 뷰에 내용 오프셋을 전달하고 서로 모두 대리인이 될 수 있습니다 (.h의 #importing은 무한 루프를 생성하기 때문에 .m 파일에 범주를 만들고 # import 그곳에).
이 경우 작동합니다. 유일한 문제는 스크롤 뷰의 대리자 인 UITableViewCell을 만들 필요가 있다는 것입니다. 나는 객체가 2 명의 델리게이트를 가질 수 없다는 것을 안다. 따라서, 뷰 콘트롤러를 사용하여 각 셀 *에 위임 메소드를 다시 호출하는 것이 좋을까? – spiralstairs
두 가지 방법으로 편집했습니다. 두 번째 방법은 셀에 모든 대리자 메서드를 전달할 필요가 없기 때문에 아마 더 깨끗합니다. –
감사합니다. 그것은 완벽하게 작동했습니다. – spiralstairs