半透明状态栏下的UITableView与UIRefreshControl(UITableView w

2019-08-01 12:26发布

我创建,我想我的半透明黑色的状态栏下方滚动一个UITableView。 在我的厦门国际银行,我只设置了表视图的y位置至-20℃,这一切看起来很好。

现在,我只是增加了一个下拉到刷新iOS6的UIRefreshControl但是这工作,因为-20 y位置的,它从状态栏后面拖。 我想它的“延伸到”位置是状态栏下,而不是落后。

这是有道理的,为什么它搞乱了,但似乎没有什么区别改变它的框架和实现代码如下内容插图等不有所作为。

该文档显示,一旦refreshControl已定,在的UITableViewController需要照顾它从此位置。

有任何想法吗?

Answer 1:

你也可以继承的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考虑在内,但你可以改变topContentInset变量任何你需要的值,它会处理其余部分。

我希望代码被记录有足够的了解它是如何工作的。



Answer 2:

只要继承了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];
}


Answer 3:

在当前upvoted答案不跟你扯了下来成分(如安东尼·德米特里耶夫指出的)事实发挥出色,偏移量是不正确。 最后一部分是解决它。

无论哪种方式:子类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];
}


Answer 4:

UIRefreshControl总是坐在你的内容上面UITableView 。 如果你需要改变的地方是refreshControl地方,尝试改变的tableView顶级contentInset 。 所述UIRefreshControl需要的是,确定它应该被定位时考虑。



Answer 5:

试试这个:

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点;



Answer 6:

我发现,在其他的答案中layoutsubviews的首要的确比改变帧更多,他们也改变了行为(控制开始下滑与内容)。 要改变帧,而不是我这样做的行为:

- (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);

}



文章来源: UITableView with UIRefreshControl under a semi-transparent status bar