【问题标题】:iOS TableView with paging?带有分页的 iOS TableView?
【发布时间】:2014-01-30 04:16:38
【问题描述】:
我正在开发一个带有漂亮 UI 的 iOS 应用程序,用于查看用户的朋友,该应用程序当前处于启用分页和 100×100pt 图片的垂直 ScrollView 中。但是,对于 500 多个朋友来说,这非常低效和缓慢,一次将所有这些图片加载到内存中。我想做的是使用 TableView 并在加载单元格时加载图像,但我真的很喜欢启用分页的 ScrollView 的捕捉效果。
您如何建议我将此功能添加到 TableView?
【问题讨论】:
标签:
ios
iphone
objective-c
uitableview
【解决方案1】:
将 UITableView 的 pagingEnabled 属性设置为 YES 始终是一种选择……但是,默认 UIScrollView 分页将自动以 UITableView 框架高度的倍数进行分页(不太可能与 UITableViewCells 的高度相同),因此您可能需要实现scrollViewWillEndDragging:withVelocity:targetContentOffset. 这个方法在 UIScrollView(或 UITableView)开始减速时调用,它允许我们指定 UIScrollView 应该在哪里结束移动。
-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView
withVelocity:(CGPoint)velocity
targetContentOffset:(inout CGPoint*)targetContentOffset
{
//Intercept and recalculate the desired content offset
CGPoint targetOffset = [self recalculateUsingTargetContentOffset:targetContentOffset];
//Reset the targetContentOffset with your recalculated value
targetContentOffset->y = targetOffset.y;
}
您可能需要查看这篇文章 (UITableView w/ paging & momentum),以了解您需要如何调整目标内容偏移重新计算方法以满足您的需求。
【解决方案2】:
UITableView 继承自 UIScrollView,因此表视图具有 pagingEnabled 属性,就像滚动视图一样。只需将-setPagingEnabled:YES 发送到您的表格视图,就像您使用滚动视图一样。
例如,在UITableViewController 子类实现中:
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView.pagingEnabled = YES;
}
【解决方案3】:
我不喜欢启用 UITableView 的分页时的滚动,因此我编写了这两个 TouchUpInside 方法(在 C# 中用于 Xamarin)并禁用了表格视图上的分页。我添加了用户可以点击以转到下一页或上一页的按钮。向下翻页时,找到的下一项将滚动到表格视图框架的顶部。向上翻页时,算法会向找到的项目添加一行,以尝试显示未跨越表格视图框架的项目。不会对可能大于表格视图边界的非常高的单元格进行检查。
partial void buttonNextPageClick( NSObject sender )
{
NSIndexPath path;
CGPoint scrollpoint;
scrollpoint = new CGPoint( 5f, tableviewFOO.ContentOffset.Y + tableviewFOO.Bounds.Height ); // down a page
path = tableviewFOO.IndexPathForRowAtPoint( scrollpoint );
if ( path == null )
path = NSIndexPath.FromRowSection( tableviewFOO.NumberOfRowsInSection( 0 ) - 1, 0 );
if ( path != null )
tableviewFOO.ScrollToRow( path, UITableViewScrollPosition.Top, true );
}
partial void buttonPreviousPageClick( NSObject sender )
{
NSIndexPath path;
CGPoint scrollpoint;
scrollpoint = new CGPoint( 5f, tableviewFOO.ContentOffset.Y - tableviewFOO.Bounds.Height ); // up a page
path = tableviewFOO.IndexPathForRowAtPoint( scrollpoint );
if ( path == null )
path = NSIndexPath.FromRowSection( 0, 0 );
else
path = NSIndexPath.FromRowSection( path.Row + 1, 0 ); // +1 for the cell that might be completely visible
if ( path != null )
tableviewFOO.ScrollToRow( path, UITableViewScrollPosition.Top, true );
}