通过下面tableview的代理实现
- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated
UITableViewScrollPosition 相关枚举类型
typedef NS_ENUM(NSInteger, UITableViewScrollPosition) {
UITableViewScrollPositionNone,
UITableViewScrollPositionTop,
UITableViewScrollPositionMiddle,
UITableViewScrollPositionBottom
}; // scroll so row of interest is completely visible at top/center/bottom of view
枚举中有上中下,根据需求选取,下面是我在使用时遇到的问题在iOS11中我选取的枚举是UITableViewScrollPositionMiddle,tableview会出现跳动的现象,最后加了下面三个方法
self.leftMenuTableView.estimatedRowHeight = 0;
self.leftMenuTableView.estimatedSectionHeaderHeight = 0;
self.leftMenuTableView.estimatedSectionFooterHeight = 0;
完美解决
简而言之estimatedRowHeight是一个预估高度,iOS11之前是为0,在iOS11下,这个值默认为44。
那么我们可以得出结论,当你的实际高度大于预估高度的时候,会按照预估高度下的cell的数量来计算contentSize,当实际高度小于预估高度的时候,会按照实际高度下的cell的数量来计算contentSize。
如果我们要回到iOS11之前的效果,我们可以让estimatedRowHeight=0,关闭这个预估高度的效果。
延展
为什么使用MJRefresh在iOS11下要让estimatedRowHeight=0,因为MJRefresh底部的上拉刷新是根据contentSize来计算的,当数据更新的时候,得出来的contentSize只是预估的。
来源:oschina
链接:https://my.oschina.net/jack088/blog/4259652