2014-06-10 100 views
0

我想实现的是“捕捉到单元格”效果在我的UITableView。 我的UITableView有3个相同大小的单元格,但由于某些原因,UITableView总是捕捉到单元格0或单元格1,并且不会捕捉到第三个单元格。无论你滑得多么艰难,它的错误也会降低50分左右。我使用最明显的代码来创建效果,所以我不明白为什么它不起作用。UITableView捕捉到单元格

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { 
    NSIndexPath *pathForTargetTopCell = [self.tableView indexPathForRowAtPoint:CGPointMake(CGRectGetMidX(self.tableView.bounds), targetContentOffset->y)]; 
    DLog(@"indexPathForRow %d", pathForTargetTopCell.row); 
    targetContentOffset->y = [self.tableView rectForRowAtIndexPath:pathForTargetTopCell].origin.y; 
} 

有什么想法可能会出错?

编辑: 我怀疑这与顶部的状态栏和导航栏有关,因为它关闭了正好64点。仍然没有解释为什么它不承认,虽然最后一个单元格..

回答

3

状态栏的偏移,在VC的viewDidLoad做到这一点:

if([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) 
    [self setAutomaticallyAdjustsScrollViewInsets:NO]; 

编辑

只是为了测试,你可以添加4个同样大小的单元格,并尝试捕捉到第3和第4个单元格?

修改您scrollViewWillEndDragging执行如下命令:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { 

    NSIndexPath *pathForCenterCell = [self.tableView indexPathForRowAtPoint:CGPointMake(CGRectGetMidX(self.tableView.bounds), CGRectGetMidY(self.tableView.bounds))]; 

    [self.tableView scrollToRowAtIndexPath:pathForCenterCell atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; 
} 
+0

加了一个第四,现在它滚动到第三位。从技术上讲,这可以解决这个问题,但这真的很糟糕。 –

+0

我编辑了我的答案。请检查是否适合您。 –

+0

它确实有用!根据速度的方向,我决定改变我的实现,以便它总是“按照”顺序依次排列到下一个单元格。但是,在我接受之前,我试图达到的目标。但是,只有当您的单元格大小接近屏幕大小时才可以使用。 –