2012-02-27 10 views
5

私はそのプルダウンからリフレッシュのことをやっています。 scrollViewDidEndDeceleratingでは、オフセットが特定のポイントを超えているかどうかをチェックし、scrollViewDidEndDraggingでは、プルダウンセクションを表示するようにcontentInsetを設定します。UITableViewがリフレッシュしてちらつきを引き起こします。それを防ぐ方法は?

しかし、おそらく、スクロールアニメーション中にcontentInsetがリセットされているために、これがちらつきを引き起こします。私はscrollViewWillEndDraggingでtargetContentOffsetを設定することでこれを防ぐことができるかもしれないと思っていましたが、そのトリックはしていないようです。あなたは(それ以外の場合はスクロールまたは中に)まったくのUITableViewに割り当てられたフレームを変更した場合

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 

    if (scrollView.contentOffset.y < -kRefreshViewDelta) 
    { 
     self.tableView.contentInset = UIEdgeInsetsMake(kRefreshViewHeight, 0.0f, 0.0f, 0.0f); 

    } 
} 

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset 
{ 
    if (scrollView.contentOffset.y < -kRefreshViewDelta) 
    { 
      targetContentOffset->y = kRefreshViewHeight ; 
    } 
} 

答えて

10

は、それがcontentInsetがデフォルト(0,0,0,0)にリセットされます。そこにいくつかの状態が鉱山をチェックするが、基本的にこれは私が私のためにやったものです...

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView 
        willDecelerate:(BOOL)decelerate { 
    if (scrollView.contentOffset.y < -kRefreshDeltaY) { 
    animation = ^{ 
     [self setContentInset:UIEdgeInsetsMake(kRefreshDeltaY, 
                  0, 0, 0)]; 
    }; 

    [UIView animateWithDuration:0.3 
          delay:0 
         options:UIViewAnimationOptionAllowUserInteraction 
        animations:animation 
        completion:completion]; 
    } // if 
} 

を限り、私はサブビューをレイアウトしたりのUITableViewのフレームを変更していないとして、それが正常に振る舞っています私のために。

0

このプルをリフレッシュするために、別のメカニズムを試しました。コード

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    if (!reloading) 
    { 
     checkForRefresh = YES; // only check offset when dragging 
    } 
} 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (reloading) return; 

    if (checkForRefresh) { 
     if (refreshHeaderView.isFlipped 
      && scrollView.contentOffset.y > -65.0f 
      && scrollView.contentOffset.y < 0.0f 
      && !reloading) { 
      [refreshHeaderView flipImageAnimated:YES]; 
      [refreshHeaderView setStatus:kPullToReloadStatus]; 


     } else if (!refreshHeaderView.isFlipped 
        && scrollView.contentOffset.y < -65.0f) { 
      [refreshHeaderView flipImageAnimated:YES]; 
      [refreshHeaderView setStatus:kReleaseToReloadStatus]; 

     } 
    } 
} 
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView 
        willDecelerate:(BOOL)decelerate 
{ 
    if (reloading) return; 

    if (scrollView.contentOffset.y <= - 65.0f) { 
     if([self.tableView.dataSource respondsToSelector: 
      @selector(reloadTableViewDataSource)]){ 
      [self showReloadAnimationAnimated:YES]; 
      [self reloadTableViewDataSource]; 
     } 
    } 
    checkForRefresh = NO; 
} 


- (void)reloadTableViewDataSource 
{ 
    [self performSelectorOnMainThread:@selector(refresh) withObject:nil waitUntilDone:NO]; 

} 
4

マイクの答えは私のために働いた(しかし、私はアップ票またはそれにコメントできませんでした)をご確認ください。私のコードをアニメーションブロックにラップすると私のちらつきがなくなったようです。

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    if (scrollView.contentOffset.y < 0 && scrollView.contentInset.top < 0) 
    { 
     // shows table header view 
     // setting inset without using animation block causes flicker 
     [UIView animateWithDuration:0.1 animations:^ 
     { 
      scrollView.contentInset = UIEdgeInsetsZero; 
     }]; 
    } 

    // hides table header view 
    if (scrollView.contentOffset.y > 44 && scrollView.contentInset.top == 0) 
    { 
     scrollView.contentInset = UIEdgeInsetsMake(-44, 0, 0, 0); 
    } 
} 
+0

ありがとうございます。私は、あなたが検索バーをヘッダーに入れようとしていることを44から仮定していますか? – MusiGenesis

+0

@MusiGenesis実際に私はユーザーが使用するようにプルダウンできる検索バーを隠していましたが、ユーザーがもう使用していないと非表示になります。 – sc0rp10n

+0

ええ、ここで同じです。 – MusiGenesis

関連する問題