2012-02-27 26 views
5

Tôi đang làm điều đó kéo xuống để làm mới. Trong scrollViewDidEndDecelerating tôi kiểm tra xem offset có qua một điểm nào đó không và trong scrollViewDidEndDragging tôi thiết lập contentInset để giữ cho phần kéo xuống có thể nhìn thấy được.UITableView kéo để làm mới gây nhấp nháy. Làm thế nào để ngăn chặn nó?

Tuy nhiên, điều này dẫn đến nhấp nháy, có thể do contentInset được đặt lại trong khi di chuyển hoạt ảnh. Tôi nghĩ rằng tôi có thể ngăn chặn điều này bằng cách thiết lập targetContentOffset trong scrollViewWillEndDragging, nhưng nó dường như không làm được điều này.

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

Trả lời

10

Nếu bạn thay đổi khung được gán cho UITableView ở tất cả (trong khi cuộn hoặc ngược lại), nó sẽ khiến nội dungĐược đặt lại về mặc định (0,0,0,0). Có một số nhà nước kiểm tra cho tôi, nhưng về cơ bản đây là những gì tôi đã làm cho tôi ...

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

Chừng nào tôi không đặt ra subviews hoặc thay đổi khung của UITableView, nó cư xử phạt cho tôi.

0

Tôi đã thử một cơ chế khác để kéo để làm mới. Vui lòng kiểm tra mã

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

Câu trả lời của Mike đã làm việc cho tôi (nhưng tôi không thể bỏ phiếu hoặc nhận xét về nó). Nó xuất hiện rằng gói mã của tôi trong khối hoạt hình loại bỏ nhấp nháy cho tôi.

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

Cảm ơn vì điều này. Tôi giả định từ 44 rằng bạn cũng đang cố gắng để có được một thanh tìm kiếm nhét lên như là tiêu đề? – MusiGenesis

+0

@MusiGenesis thực sự tôi đã ẩn một thanh tìm kiếm mà người dùng có thể kéo xuống để sử dụng nhưng sẽ bị ẩn sau khi người dùng không sử dụng nữa. – sc0rp10n

+0

Vâng, cùng ở đây. – MusiGenesis