iOS7 UIRefreshControl更改contentInset

时间:2013-11-20 16:35:11

标签: ios objective-c uitableview uirefreshcontrol

我的应用中有一个UINavigationControllerUINavigationBar设置为不透明,并且所有滚动视图都不会在条形图下方重叠。

在一个视图中,我有一个UITableView。我的iPhone 5上UITableView的框架是(0 0; 320 504),即高度为568 - 64(导航栏和状态栏的高度)。

contentInset的{​​{1}}为UITableView。当表格视图首次加载时,(0, 0, 0, 0)contentOffset

这很好。工作出色。

我在表格视图中添加了(0, 0)。这可以工作几次,但是经过几次拉动刷新之后,顶部的内容会在导航栏下“卡住”。

如果发生这种情况,我会检查UIRefreshControl,现在是contentInset

有没有办法阻止UIRefreshControl更改(-60, 0, 0, 0)

4 个答案:

答案 0 :(得分:7)

我会在这里添加这个答案,以防任何人通过更改控件属性(属性标题,色调等等)来解决UIRefreshControl问题:

请勿使用UIRefreshControl上的-viewDidLoad:,而是使用-viewDidAppear:

答案 1 :(得分:6)

这可能是UIRefreshControl目前仅在UITableViewController上受支持的原因,而不是添加到任何滚动视图(在许多情况下你可以放弃)。

刷新控件通过修改scrollview的内容插入来发挥其魔力 ​​- 特别是当它结束刷新时。不幸的是,视图控制器还在修改滚动视图的内容插入,以使其适合半透明的导航和状态栏。随之而来的乐趣。这也是iOS 6上的一个问题(或者,当我处理同样的问题时,我称之为“好旧的iOS6”)。

最快的解决方案可能是将您的表视图添加为子UITableViewController而不是简单的子视图。我认为UITableViewController在刷新结束时为您管理insets。如果这不起作用,我已经为此做了解决方法,但它必须等到我回到办公室。

答案 2 :(得分:4)

重置您的表格视图contentInset。

-(void)pullToRefresh
{
    [self.tableView reloadData];
    [self.refreshControl endRefreshing];
    [self.tableView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)];
}

答案 3 :(得分:3)

您需要在UICollectionView

中覆盖setContentInset :.
- (void)setContentInset:(UIEdgeInsets)contentInset {
  if (self.tracking) {
    CGFloat difference = contentInset.top - self.contentInset.top;
    CGPoint translation = [self.panGestureRecognizer translationInView:self];
    translation.y -= difference * 3.0 / 2.0;
    [self.panGestureRecognizer setTranslation:translation inView:self];
  }
  [super setContentInset:contentInset];
}