我的应用有自定义UITableView
单元格。我想一次只显示一个单元格 - 下一个单元格应该部分显示。在ScrollView中,您可以将isPagingEnabled
设置为YES。
但我如何在UITableView
?
由于
答案 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)
}
}
}