31

私のアプリケーションでは、コレクション ビューでリフレッシュ コントロールを使用しています。

UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:[UIScreen mainScreen].bounds];
collectionView.alwaysBounceVertical = YES;
...
[self.view addSubview:collectionView];

UIRefreshControl *refreshControl = [UIRefreshControl new];
[collectionView addSubview:refreshControl];

iOS7 には厄介なバグがあり、コレクション ビューを下に引っ張って更新を開始するときに指を離さないと、垂直方向contentOffsetに 20 ~ 30 ポイント下に移動し、醜いスクロール ジャンプが発生します。

の外で更新制御を使用してテーブルを使用すると、テーブルにもこの問題が発生しますUITableViewControllerUIRefreshControlしかし、それらの場合は、インスタンスをUITableViewのプライベート プロパティに割り当てることで簡単に解決できます_refreshControl

@interface UITableView ()
- (void)_setRefreshControl:(UIRefreshControl *)refreshControl;
@end

...

UITableView *tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self.view addSubview:tableView];

UIRefreshControl *refreshControl = [UIRefreshControl new];
[tableView addSubview:refreshControl];
[tableView _setRefreshControl:refreshControl];

しかし、UICollectionViewそのようなプロパティを持っていないので、手動で処理する方法が必要です。

4

2 に答える 2

52

同じ問題があり、それを修正するように思われる回避策を見つけました。

これUIScrollViewは、スクロールビューの端を越えて引っ張ると、パン ジェスチャの追跡が遅くなるため、発生しているようです。ただし、UIScrollView追跡中の contentInset への変更は考慮されていません。UIRefreshControlアクティブ化すると contentInset が変更され、この変更がジャンプを引き起こしています。

このケースをオーバーライドsetContentInsetして説明するUICollectionViewと、次のようになります。

- (void)setContentInset:(UIEdgeInsets)contentInset {
  if (self.tracking) {
    CGFloat diff = contentInset.top - self.contentInset.top;
    CGPoint translation = [self.panGestureRecognizer translationInView:self];
    translation.y -= diff * 3.0 / 2.0;
    [self.panGestureRecognizer setTranslation:translation inView:self];
  }
  [super setContentInset:contentInset];
}

興味深いことに、UITableView更新コントロールを通過するまで追跡を遅くしないことで、これを説明しています。ただし、この動作が公開される方法はわかりません。

于 2013-11-12T10:40:35.057 に答える