为什么UITableView contentOffset在使用分段控件时会发生变化?

时间:2016-04-12 20:37:45

标签: ios swift uitableview uiscrollview uikit

我有一个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()时存储内容偏移值。

3 个答案:

答案 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];
}];

这不是最标准的答案,当我找到更好的方法时,我将在这里更新答案。