希望UITableView"对齐单元格"

Vap*_*olf 18 objective-c uitableview uiscrollviewdelegate ios

我正在显示相当大的图像UITableView.当用户滚动时,我希望在桌面视图中始终将中心最多的照片捕捉到中间.也就是说,当桌子处于静止状态时,它将始终UITableViewCell与中心对齐.

怎么做到这一点?

jsz*_*ski 29

您可以使用以下UIScrollViewDelegate方法UITableView执行此操作:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    // if decelerating, let scrollViewDidEndDecelerating: handle it
    if (decelerate == NO) {
        [self centerTable];
    }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    [self centerTable];
}

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

    [self.tableView scrollToRowAtIndexPath:pathForCenterCell atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
}
Run Code Online (Sandbox Code Playgroud)


Jes*_*sak 17

有一个UIScrollView委托方法,特别是为此!

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset当用户停止滚动时,表视图(滚动视图)将调用.您可以设置操作targetContentOffset以确保它最终到达您想要的位置,并且它将在该位置结束减速(就像分页UIScrollView一样).

例如,如果你的细胞都高100点,你可以这样做:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
    targetContentOffset->y = 100 * (int)targetContentOffset->y/100;
}
Run Code Online (Sandbox Code Playgroud)

当然,您也可以检查targetContentOffset传入的内容以查看它将要着陆的位置,然后找到所在的单元格并对其进行适当更改.


小智 6

扩展@ jesse-rusak上面的答案,如果您的单元格具有可变高度,则需要添加到UITableViewController子类中的代码.这将避免接受的答案中的双滚动问题.

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
    NSIndexPath *pathForTargetTopCell = [self.tableView indexPathForRowAtPoint:CGPointMake(CGRectGetMidX(self.tableView.bounds), targetContentOffset->y)];
    targetContentOffset->y = [self.tableView rectForRowAtIndexPath:pathForTargetTopCell].origin.y;
}
Run Code Online (Sandbox Code Playgroud)


qua*_*ato 5

根据@jszumski发布的内容构建,如果您希望在拖动过程中进行捕捉,请使用以下代码:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    [self centerTable];
}

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
    [self centerTable];
}

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

    [self.tableView scrollToRowAtIndexPath:pathForCenterCell atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
}
Run Code Online (Sandbox Code Playgroud)