我有一个UITableView
,其导航栏中有一个分段控件。我使用相同的表视图来显示3个不同的数据集,基于分段控件的选定索引。我现在正在尝试保留每个段选项的滚动位置,以便看起来每个段选项都有一个表(即每个选择的结果都有独立的滚动位置)。
为此,我为每个状态存储一个CGPoint
变量,当所选的段索引发生变化时,设置到contentOffset
。该变量是使用来设置表格视图在段更改时的内容偏移量。
但是,当所选的段索引发生更改而表中的位置没有任何可见的更改时,contentOffset
值似乎会更改。这就像内容偏移的0位置正在移动,这使我的存储值现在错误。
当我的控制器包含以下方法时:
override func viewDidLoad() {
// set up the view here...
print(tableView.contentOffset)
}
@IBAction func selectedSegmentChanged(sender: AnyObject) {
print(tableView.contentOffset)
// code to change the data shown in the table view...
}
加载视图时会记录以下内容:
(0.0,0.0)
但在更改片段后我得到:
(0.0,-64.0)
所有州都显示表格视图滚动到完全相同的位置,即 - 在顶部。
此行为阻止我能够正确存储滚动位置,因为这意味着'内容偏移似乎正在发生变化。
修改:内容偏移实际上是在viewDidLoad()
和viewDidAppear()
之间调整的,很可能是由于内容插入。所以我现在在第一次调用viewDidAppear()
时存储内容偏移值。
答案 0 :(得分:4)
此问题通常是由视图控制器上的属性引起的。将其设置为false
应修复它。
self.automaticallyAdjustsScrollViewInsets = false
也可以从故事板中设置。只需选择视图控制器并取消选中Adjusts scroll view insets
。
答案 1 :(得分:1)
设置tableview EstimateRowHeight解决了该问题
tableView.estimatedRowHeight = Cell_Row_Height
答案 2 :(得分:0)
我刚才遇到了这个问题,在某些情况下,似乎该问题与UITableView一致。
我的问题是当我的UITableView具有headerView时引起的。 headerView与Section中的Header不同,它是UITableView类的属性,必须基于框架。我的headerView的高度大于:
[[UIScreen mainScreen] bounds].height;
我也将ContentInset设置为普通的statusBarHeight + 44.0f
,但是在tableView上执行reloadData
之后,tableView会自动调整它的ContentOffset。
我的解决方案是,考虑通过UITableView设置ContentOffset以确保列表的开头是可见的。在执行reloadData
之后,我将tableView设置为滚动到开头。
这是我的代码:
self.headerView = [ProgramDetailsHeaderView new];
self.headerView.frame = CGRectMake(0, 0, [Utilz deviceWidth], [ProgramDetailsHeaderView headerHeightWithModel:self.model]);
[self.headerView setDelegate:self];
self.tableView = [UITableView new];
self.tableView.translateAutoResizingMaskIntoConstraint = NO;
self.tableView.tableHeaderView = self.headerView;
self.tableView.delegate = self;
self.tableView.dataSource = self;
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
self.tableView.showsVerticalScrollIndicator = NO;
self.tableView.estimatedRowHeight = 0;
self.tableView.contentInset = UIEdgeInsetsMake(_statusBarHeight + 44.0f, 0, [Utilz deviceBottomNotch] + 10, 0);
[self.view addSubview:self.tableView];
// TableView Constraints...
[UIView animateWithDuration:0 animations:^{
[weakSelf.tableView reloadData];
} completion:^(BOOL finished) {
[weakSelf.tableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];
}];
这不是最标准的答案,当我找到更好的方法时,我将在这里更新答案。