我面临着一个简单但又乏味的问题。 我正在尝试做的是使UITableView像UIScrollView一样页面,但是启用分页对我没有多大帮助,因为我无法设置页面大小,因此tableview完全滚动其高度,因此它显示行1 ... 10或11 ...... 20等等。 我想要的是,当我滚动(因此进行分页)而没有显示一系列固定单元格时,没有单元格在视图上方或下方被剪裁。
非常感谢
答案 0 :(得分:17)
更简单,更高效:)
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
if(decelerate) return;
[self scrollViewDidEndDecelerating:scrollView];
}
- (void)scrollViewDidEndDecelerating:(UITableView *)tableView {
[tableView scrollToRowAtIndexPath:[tableView indexPathForRowAtPoint: CGPointMake(tableView.contentOffset.x, tableView.contentOffset.y+tableView.rowHeight/2)] atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
答案 1 :(得分:13)
简单但高效:
- (void)scrollViewDidEndDecelerating:(UITableView *)tableView {
int tomove = ((int)tableView.contentOffset.y%(int)tableView.rowHeight);
if(tomove < tableView.rowHeight/2) [tableView setContentOffset:CGPointMake(0, tableView.contentOffset.y-tomove) animated:YES];
else [tableView setContentOffset:CGPointMake(0, tableView.contentOffset.y+(tableView.rowHeight-tomove)) animated:YES];
}
- (void)scrollViewDidEndDragging:(UITableView *)scrollView willDecelerate:(BOOL)decelerate {
if(decelerate) return;
[self scrollViewDidEndDecelerating:scrollView];
}
答案 2 :(得分:5)
从k06a's answer开始,我对它进行了一些改进,使其更像真正的分页UITableView。全屏表行的行为差异非常明显。即使是任何一个方向的小动作也应该将表格滚动到下一页:我首先通过检查速度来做到这一点。
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
withVelocity:(CGPoint)velocity
targetContentOffset:(inout CGPoint *)targetContentOffset
{
CGFloat rowHeight = tableView.rowHeight;
int verticalOffset = ((int)targetContentOffset->y % (int)rowHeight);
if (velocity.y < 0)
{
targetContentOffset->y -= verticalOffset;
}
else if (velocity.y > 0)
{
targetContentOffset->y += (rowHeight - verticalOffset);
}
// No velocity, snap to closest page
else
{
if (verticalOffset < rowHeight / 2)
{
targetContentOffset->y -= verticalOffset;
}
else
{
targetContentOffset->y += (rowHeight - verticalOffset);
}
}
}
请注意另外设置
self.tableView.decelerationRate = UIScrollViewDecelerationRateFast;
<{1>}中的使它更接近真实的东西,但并不完全。
我一直在努力使用code shown here设置更快的减速率,但我无法做到正确。
答案 3 :(得分:4)
这就像真正的分页一样:
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
withVelocity:(CGPoint)velocity
targetContentOffset:(inout CGPoint *)targetContentOffset
{
int tomove = ((int)targetContentOffset->y % (int)self.tableView.rowHeight);
if(tomove < self.tableView.rowHeight/2)
targetContentOffset->y -= tomove;
else
targetContentOffset->y += (self.tableView.rowHeight-tomove);
}
并在-viewDidLoad
:
self.tableView.decelerationRate = UIScrollViewDecelerationRateFast;
答案 4 :(得分:3)
在斯威夫特......
func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if !decelerate {
self.scrollViewDidEndDecelerating(scrollView)
}
}
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
if let indexPathToScrollTo: NSIndexPath = self.tableView.indexPathForRowAtPoint(CGPointMake(self.tableView.contentOffset.x, self.tableView.contentOffset.y+tableView.rowHeight/2)) {
self.tableView.scrollToRowAtIndexPath(indexPathToScrollTo, atScrollPosition: UITableViewScrollPosition.Top, animated: true)
}
}