2012-02-27 72 views
5

我正在做下拉刷新的事情。在scrollViewDidEndDecelerating中,我檢查偏移量是否超過某個點,並在scrollViewDidEndDragging中設置contentInset以保持拉下的部分可見。UITableView拉來刷新導致閃爍。如何預防它?

但是,這會導致閃爍,可能是由於contentInset在滾動動畫期間被重置。我想我可以通過在scrollViewWillEndDragging中設置targetContentOffset來防止這種情況,但似乎沒有辦法。

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

如果你改變在全部分配到的UITableView框架(滾動或其他期間),這將導致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 2013-07-19 14:18:09

+0

@MusiGenesis的確我隱藏了一個搜索欄,用戶可以使用這個搜索欄,但是一旦用戶不再使用它,就會隱藏起來。 – sc0rp10n 2013-08-01 23:13:14

+0

是的,這裏也一樣。 – MusiGenesis 2013-08-02 15:37:09