2013-11-20 6 views
11

私のアプリにUINavigationControllerがあります。 UINavigationBarは不透明に設定され、すべてのスクロールビューはバーの下に重ならない。iOS7 UIRefreshControl changes contentset

私はUITableViewを持っています。 UITableViewのフレームは私のiPhone 5の(0 0; 320 504)です。つまり、高さは568 - 64(ナビゲーションバーとステータスバーの高さ)です。

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

答えて

6

UIRefreshControlは現在のところ、UITableViewControllerでのみサポートされています。多くの場合、スクロールビューに追加するのではなく、多くの場合これがサポートされています。

リフレッシュコントロールは、スクロールビューのコンテンツインセットを調整することで、特にリフレッシュが終了したときに、その魔法を修正します。残念なことに、View Controllerは、スクロールビューのコンテンツインセットを使用して、半透明のNavおよびステータスバーの下にフィットさせます。楽しみは続く。これはiOS 6(または同じ問題を扱うときに私がそれを呼んだ「good old 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

3

テーブルビューのコンテンツをリセットします。

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

あなたが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]; 
} 
+0

あなたが言及したURLはもう存在しません – Nagarjun

6

をUICollectionViewに私がコントロールのプロパティ(帰属タイトル、色合いなどを変更することにより、UIRefreshControlでいずれかに問題がある場合には、ここでこの答えを追加します。.. ):

UIRefreshControl-viewDidLoad:に置き換えないでください。代わりに-viewDidAppear:を使用してください。

+1

ページが表示されるたびにelse(!refreshControl)else条件を設定してください。 – George

+0

私の問題を解決しました。 –