iOS7 UIRefreshControl更改contentInset

问题描述:

我在我的应用程序中有一个UINavigationControllerUINavigationBar被设置为不透明,并且所有的滚动视图在栏下方不重叠。我有一个UITableView。我的iPhone 5上的UITableView的框架为(0 0; 320 504),即高度为568 - 64(导航栏和状态栏的高度)。iOS7 UIRefreshControl更改contentInset

UITableViewcontentInset(0, 0, 0, 0)。当表格视图第一次加载contentOffset时是(0, 0)

这很好。精彩的工作。

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

发生这种情况时,我检查了contentInset,现在是(-60, 0, 0, 0)

有没有办法阻止UIRefreshControl更改contentInset

+0

删除我的答案,因为你已经排除了它。你在打电话给endRefreshing,我想? – jhilgert00

+0

不用担心。是的,当我在控件上调用'endRefreshing'时,它会消失。这可以很好地工作几次,但它吓坏了,'contentInset'更改隐藏导航栏下的前几行。 – Fogmeister

+0

刷新后你可能会重置你的框架,但你不应该这样做。 – jhilgert00

这可能是为什么UIRefreshControl目前仅在UITableViewController上支持的原因,而不是通过添加任何滚动视图(在许多情况下您可以省略)。

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

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

+1

我现在似乎已经解决了这个问题。我意识到'NSOperation'的'completionBlock'在与操作相同的线程上被调用。这就是我叫'endRefreshing'的地方。我将它发送给主线程,并且现在正在工作而不更改'contentInset'。你有没有关于'UIRefreshControl'的任何链接只能正式支持'UITVC'? – Fogmeister

+0

文档说它被分配给UITVC。 addSubview:事物仅在SO上提及,从未在文档中提及。 – jrturton

+0

请参阅Dave DeLong对此答案的评论:http://stackoverflow.com/a/12502450/852828 – jrturton

重置您的表格视图contentInset。

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

你需要重写setContentInset:在你UICollectionView

- (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]; 
} 
+0

您提到的URL不再存在 – Nagarjun

我会通过改变控制特性(归因标题,色调等,在此情况下,添加这个答案的任何人有问题UIRefreshControl .. 。):

不要惹的UIRefreshControl,改为使用-viewDidAppear:

+1

确保您放置条件if(!refreshControl)否则每次出现您的页面时都会向其添加refreshcontrol。 – George

+0

解决了我的问题,谢谢。 –