由于 UITableView 是 UIScrollView 的子类,你可以实现 UIScrollViewDelegate 方法:
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
withVelocity:(CGPoint)velocity
targetContentOffset:(inout CGPoint *)targetContentOffset
然后计算您想要的最接近的目标内容偏移量,并将其设置在 inout CGPoint 参数上。
我刚试过这个,效果很好。
首先,像这样检索未引导的偏移量:
CGFloat unguidedOffsetY = targetContentOffset->y;
然后通过一些数学计算,你希望它在哪里,注意表格标题的高度。这是我的代码中处理代表美国各州的自定义单元格的示例:
CGFloat guidedOffsetY;
if (unguidedOffsetY > kFirstStateTableViewOffsetHeight) {
int remainder = lroundf(unguidedOffsetY) % lroundf(kStateTableCell_Height_Unrotated);
log4Debug(@"Remainder: %d", remainder);
if (remainder < (kStateTableCell_Height_Unrotated/2)) {
guidedOffsetY = unguidedOffsetY - remainder;
}
else {
guidedOffsetY = unguidedOffsetY - remainder + kStateTableCell_Height_Unrotated;
}
}
else {
guidedOffsetY = 0;
}
targetContentOffset->y = guidedOffsetY;
上面的最后一行,实际上将值写回 inout 参数,它告诉滚动视图这是您希望它捕捉到的 y 偏移量。
最后,如果您正在处理获取的结果控制器,并且您想知道刚刚捕捉到的内容,您可以执行以下操作(在我的示例中,属性“states”是美国各州的 FRC) .我使用该信息来设置按钮标题:
NSUInteger selectedStateIndexPosition = floorf((guidedOffsetY + kFirstStateTableViewOffsetHeight) / kStateTableCell_Height_Unrotated);
log4Debug(@"selectedStateIndexPosition: %d", selectedStateIndexPosition);
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:selectedStateIndexPosition inSection:0];
CCState *selectedState = [self.states objectAtIndexPath:indexPath];
log4Debug(@"Selected State: %@", selectedState.name);
self.stateSelectionButton.titleLabel.text = selectedState.name;
题外话:正如您可能猜到的,“log4Debug”语句只是记录日志。顺便说一句,我使用的是 Lumberjack,但我更喜欢旧 Log4Cocoa 中的命令语法。