UITableView分页

时间:2012-08-10 11:17:52

标签: iphone ios xcode uitableview

我的应用有自定义UITableView单元格。我想一次只显示一个单元格 - 下一个单元格应该部分显示。在ScrollView中,您可以将isPagingEnabled设置为YES。

但我如何在UITableView

上面做

由于

3 个答案:

答案 0 :(得分:6)

请注意UITableView继承自UIScrollView,因此您可以在表格视图中将pagingEnabled设置为YES

当然,这只有在所有单元格和表格视图本身具有相同高度时才有效。

如果您希望在滚动后始终在表格视图的顶部开始单元格,则可以使用UIScrollViewDelegate并实现类似的内容。

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
                     withVelocity:(CGPoint)velocity
              targetContentOffset:(inout CGPoint *)targetContentOffset
{
  UITableView *tv = (UITableView*)scrollView;
  NSIndexPath *indexPathOfTopRowAfterScrolling = [tv indexPathForRowAtPoint:
                                                       *targetContentOffset
                                                 ];
  CGRect rectForTopRowAfterScrolling = [tv rectForRowAtIndexPath:
                                             indexPathOfTopRowAfterScrolling
                                       ];
  targetContentOffset->y=rectForTopRowAfterScrolling.origin.y;
}

这使您可以调整滚动操作将结束的内容偏移量。

答案 1 :(得分:0)

我认为我根本不会使用UITableView。

我想我会使用带有高堆栈分页内容的UIScrollView。您可以在滚动活动中动态重建该内容,因此您可以模仿UITableView的内存管理。 UIScrollView将很乐意进行垂直分页,具体取决于其contentView框架的形状。

换句话说,我怀疑使UIScrollView像表格一样比制作像滚动视图这样的UITableView分页更容易。

答案 2 :(得分:0)

Swift 5基本版本,但效果不佳。我需要对它进行自定义以供其使用。

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    if let tv = scrollView as? UITableView {
        let path = tv.indexPathForRow(at: targetContentOffset.pointee)
        if path != nil {
            self.scrollToRow(at: path!, at: .top, animated: true)
        }
    }
}

定制版本

// If velocity is less than 0, then scrolling up
// If velocity is greater than 0, then scrolling down
if let tv = scrollView as? UITableView {
    let path = tv.indexPathForRow(at: targetContentOffset.pointee)
    if path != nil {
        // >= makes scrolling down easier but can have some weird behavior when scrolling up
        if velocity.y >= 0.0 {
            // Assumes 1 section
            // Jump to bottom one because user is scrolling down, and targetContentOffset is the very top of the screen
            let indexPath = IndexPath(row: path!.row + 1, section: path!.section)
            if indexPath.row < self.numberOfRows(inSection: path!.section) {
                self.scrollToRow(at: indexPath, at: .top, animated: true)
            }
         } else {
             self.scrollToRow(at: path!, at: .top, animated: true)
         }
    }
}