6

半透明の黒いステータスバーの下をスクロールしたい UITableView を作成しました。私の XIB では、テーブル ビューの y 位置を -20 に設定しただけで、すべて問題なく表示されます。

今、プルしてリフレッシュする iOS6 UIRefreshControl を追加しましたが、これは動作しますが、-20 y の位置のために、ステータス バーの後ろからドラッグします。ステータスバーの後ろではなく下に「伸ばした」位置にしたいと思います。

なぜそれが台無しになっているのかは理にかなっていますが、フレームを変更しても違いはないようで、テーブルビューのコンテンツインセットなどに違いはありません。

ドキュメントは、 refreshControl が設定されると、それ以降は UITableViewController がその位置を処理することを示唆しています。

何か案は?

4

7 に答える 7

9

をサブクラス化し、次のよう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;
}

それはtableViewcontentInsetを考慮に入れますが、topContentInset変数を必要な値に変更することができ、残りは処理されます。

コードがどのように機能するかを理解するのに十分なほど文書化されていることを願っています。

于 2013-06-19T19:44:52.863 に答える
4

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];
}
于 2012-10-31T17:42:49.480 に答える
1

現在支持されている回答は、コンポーネントを引き下げるという事実ではうまく機能しません (Anthony 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];
}
于 2013-07-17T12:41:53.130 に答える
0

UIRefreshControl常にあなたのコンテンツの上に座っていますUITableView。refreshControlの場所を変更する必要がある場合は、tableViewのtopを変更してみてくださいcontentInset。はUIRefreshControl、配置する場所を決定するときにそれを考慮に入れます。

于 2012-10-17T03:01:34.330 に答える
0

これを試して:

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 ポイント下に移動します。

于 2013-05-28T03:23:18.953 に答える