我使用下面的代码强制将uitableview强行转换为":
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
// if decelerating, let scrollViewDidEndDecelerating: handle it
if (decelerate == NO) {
[self centerTable];
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
[self centerTable];
}
- (void)centerTable {
NSIndexPath *pathForCenterCell = [self.tableView indexPathForRowAtPoint:CGPointMake(CGRectGetMidX(self.tableView.bounds), CGRectGetMidY(self.tableView.bounds))];
[self.tableView scrollToRowAtIndexPath:pathForCenterCell atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
}
它在iOS9中工作正常,但在iOS8中,表视图不允许我捕捉到第一行或最后一行。如果我在索引路径计算后在centerTable
中放置一个断点,我会在表视图中得到它:
iOS9:
<UITableView: 0x7fb9a6ed8600; frame = (0 0; 300 132); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7fb9ae14cae0>; layer = <CALayer: 0x7fb9ad1b1540>; contentOffset: {0, 0}; contentSize: {300, 220}>
iOS8上:
<UITableView: 0x7ff6e2d59800; frame = (0 0; 300 132); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7ff6e8726130>; layer = <CALayer: 0x7ff6e214b450>; contentOffset: {0, 0}; contentSize: {300, 132.5}>
请注意,除了contentSize之外,所有内容都相同。与iOS9相比,这导致iOS8中的索引路径为n+1
。
那么,为什么在iOS8中系统对contentSize的计算方式不同???什么是解决方法?
答案 0 :(得分:1)
虽然我不知道为什么contentSize
不同,但这是我的准确问题的中心解决方法:
- (void)centerTableViewAnimated:(BOOL)animated {
NSIndexPath *centerCellIndexPath = [self.tableView indexPathForRowAtPoint:CGPointMake(CGRectGetMidX(self.tableView.bounds), CGRectGetMidY(self.tableView.bounds))];
CGPoint contentOffset = CGPointMake(0, (centerCellIndexPath.row * self.tableView.rowHeight) - ((self.tableView.frame.size.height / 2) - (self.tableView.rowHeight / 2)));
[self.tableView setContentOffset:contentOffset animated:animated];
}
所以基本上,我没有尝试使用scrollToRowAtIndexPath
,而是直接设置contentOffset
(你可以为它设置动画,这很好)。这似乎在iOS 8和iOS 9上运行良好。