UITableView与UIRefreshControl在半透明状态栏下

我创build了一个UITableView,我想在我的半透明黑色状态栏下滚动。 在我的XIB中,我只是将表视图的y位置设置为-20,这一切看起来都很好。

现在,我刚刚添加了一个拉到刷新的iOS6 UIRefreshControl,然而,由于-20年的位置,它从状态栏后面拖动。 我希望它被“延伸到”位于状态栏之下而不是后面。

这是有道理的,为什么它搞砸了,但似乎没有任何改变它的框架和tableview的内容插图等没有任何区别。

该文档build议,一旦refreshControl被设置,UITableViewController照顾它的位置从那时起。

有任何想法吗?

您可以UIRefreshControl并实现layoutSubviews如下所示:

 @implementation RefreshControl { CGFloat topContentInset; BOOL topContentInsetSaved; } - (void)layoutSubviews { [super layoutSubviews]; // getting containing scrollView UIScrollView *scrollView = (UIScrollView *)self.superview; // saving present top contentInset, because it can be changed by refresh control if (!topContentInsetSaved) { topContentInset = scrollView.contentInset.top; topContentInsetSaved = YES; } // saving own frame, that will be modified CGRect newFrame = self.frame; // if refresh control is fully or partially behind UINavigationBar if (scrollView.contentOffset.y + topContentInset > -newFrame.size.height) { // moving it with the rest of the content newFrame.origin.y = -newFrame.size.height; // if refresh control fully appeared } else { // keeping it at the same place newFrame.origin.y = scrollView.contentOffset.y + topContentInset; } // applying new frame to the refresh control self.frame = newFrame; } 

它将tableView的contentInset考虑在内,但是您可以将topContentInsetvariables更改为您需要的任何值,并将处理剩下的值。

我希望代码被logging下来足以理解它是如何工作的。

只是子类的UIRefreshControl和重写layoutSubviews像这样:

 - (void)layoutSubviews { UIScrollView* parentScrollView = (UIScrollView*)[self superview]; CGSize viewSize = parentScrollView.frame.size; if (parentScrollView.contentInset.top + parentScrollView.contentOffset.y == 0 && !self.refreshing) { self.hidden = YES; } else { self.hidden = NO; } CGFloat y = parentScrollView.contentOffset.y + parentScrollView.scrollIndicatorInsets.top + 20; self.frame = CGRectMake(0, y, viewSize.width, viewSize.height); [super layoutSubviews]; } 

目前的积极的答案不适合你拉组件的事实(如安东尼Dmitriyev指出),偏移是不正确的。 最后一部分是解决它。

无论哪种方式:使用以下方法子类UIRefreshControl

 - (void)layoutSubviews { UIScrollView* parentScrollView = (UIScrollView*)[self superview]; CGFloat extraOffset = parentScrollView.contentInset.top; CGSize viewSize = parentScrollView.frame.size; if (parentScrollView.contentInset.top + parentScrollView.contentOffset.y == 0 && !self.refreshing) { self.hidden = YES; } else { self.hidden = NO; } CGFloat y = parentScrollView.contentOffset.y + parentScrollView.scrollIndicatorInsets.top + extraOffset; if(y > -60 && !self.isRefreshing){ y = -60; }else if(self.isRefreshing && y <30) { y = y-60; } else if(self.isRefreshing && y >=30) { y = (y-30) -y; } self.frame = CGRectMake(0, y, viewSize.width, viewSize.height); [super layoutSubviews]; } 

UIRefreshControl始终位于UITableView的内容之上。 如果您需要更改refreshControl的位置,请尝试更改tableView的顶级contentInsetUIRefreshControl在确定应该放置的位置时将其考虑在内。

尝试这个:

 CGFloat offset = 44; for (UIView *subview in [self subviews]) { if ([subview isKindOfClass:NSClassFromString(@"_UIRefreshControlDefaultContentView")]) { NSLog(@"Setting offset!"); [subview setFrame:CGRectMake(subview.frame.origin.x, subview.frame.origin.y + offset, subview.frame.size.width, subview.frame.size.height)]; } } 

这将使UIRefreshControll下降44点;

我发现在其他答案布局子视图的重写不仅仅是改变框架,他们也改变了行为(控制开始下滑的内容)。 要改变框架,但不是行为,我做到了这一点:

 - (void)layoutSubviews { [super layoutSubviews]; CGRect frame = self.frame; CGFloat desiredYOffset = 50.0f; self.frame = CGRectMake(frame.origin.x, frame.origin.y + desiredYOffset, frame.size.width, frame.size.height); 

}