iOS 개발 튜 토리 얼 의 UIRefreshControl 에 사용 되 는 구덩이 밟 기 안내

iOS UIRefreshControl 기본 사용법

- (void) loadRefreshView
{
 //     
 _refreshControl = [[UIRefreshControl alloc] init];
 _refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"    "];
 [_refreshControl addTarget:self action:@selector(loadData) forControlEvents:UIControlEventValueChanged];
 [self.securityCollectionView addSubview:_refreshControl];
 [self.securityCollectionView sendSubviewToBack:_refreshControl];
}

//       
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
 decelerate = YES;
 if (scrollView.contentOffset.y < HEIGHT_REFRESH) {
  dispatch_async(dispatch_get_main_queue(), ^{
   _refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"    "];
  });
  [_refreshControl beginRefreshing];
  [self loadData];
 }
}

//       
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
 if (scrollView.contentOffset.y >= HEIGHT_REFRESH) {
  _refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"    "];
 }
 else if (!scrollView.decelerating) {
  _refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"    "];
 }
}

//     
- (void) endRefreshControl
{
 [_refreshControl endRefreshing];
}

//        
- (void) loadData
{
 [self endRefreshControl];
 // [self performSelector:@selector(endRefreshControl) withObject:nil afterDelay:2];
}

//    collection         collectionView,
//         ,      ;                
self.rootView.collectionView.alwaysBounceVertical = YES;
문제 설명
다음 화 제 를 이 어 TabBar 의 클릭 리 셋 을 실현 한 후에 도 계속 작성 에 성공 하고 UITableView 를 리 셋 하기 시 작 했 습 니 다.그래서 iOS 10 이후 UIScrollView 는 UIRefreshControl 의 속성 이 있 음 을 감안 하여 아예 자체 적 으로 썼 습 니 다.그래서 다음 과 같은 코드 가 생 겼 습 니 다.
UITableView 에 UIRefreshControl 추가

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
refreshControl.tintColor = [UIColor grayColor];
refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"    "];
[refreshControl addTarget:self action:@selector(refreshTabView) forControlEvents:UIControlEventValueChanged];
self.newsTableView.refreshControl = refreshControl;
드 롭 다운 리 셋 이벤트

-(void)refreshTabView
{
//      
[self.newsData insertObject:[self.newsData firstObject] atIndex:0];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.newsTableView reloadData];
if ([self.newsTableView.refreshControl isRefreshing]) {
[self.newsTableView.refreshControl endRefreshing];
}
});
}
TabBar 클릭 이벤트

-(void)doubleClickTab:(NSNotification *)notification{
//           NSInteger           
//                  ,   NSNumber      
NSNumber *index = notification.object;
if ([index intValue] == 1) {
//  
[self.newsTableView.refreshControl beginRefreshing];
}
}
이때 의 효 과 는 다음 과 같 습 니 다.바로 드 롭 다운 하여 리 셋 하면 되 지만 TabBar 를 누 르 면 안 됩 니 다.

이상 상황 리 셋.gif
문 제 를 분석 하 다
Google 도움말 을 통 해 시스템 자체 의 UIRefreshControl 에 두 개의 함정 이 있 기 때문에 이 유 를 알 게 되 었 습 니 다.
  • -begin Refreshing 방법 을 호출 하면 UIControlEventValueChanged 이벤트 가 발생 하지 않 습 니 다
  • -begin Refreshing 방법 을 호출 하면 진도 권 이 자동 으로 표시 되 지 않 습 니 다
  • 즉,-begin Refreshing 방법 만 호출 하 는 것 은 소 용이 없다.그러면 대응 하 는 것 은 두 가지 일 을 해 야 한다.
    UIRefreshControl 을 수 동 으로 설정 한 이벤트;
  • UITableView 의 ContentOffset 을 수 동 으로 설정 하여 진도 권 을 드 러 냅 니 다.
  • 문 제 를 해결 하 다
    위의 세 번 째 단계 의 코드 만 다음 과 같이 수정 해 야 합 니 다.
    
    -(void)doubleClickTab:(NSNotification *)notification{
    //           NSInteger           
    //                  ,   NSNumber      
    NSNumber *index = notification.object;
    if ([index intValue] == 1) {
    //  
    //animated   YES,       
    [self.newsTableView setContentOffset:CGPointMake(0, self.newsTableView.contentOffset.y - self.newsTableView.refreshControl.frame.size.height) animated:NO];
    [self.newsTableView.refreshControl beginRefreshing];
    [self.newsTableView.refreshControl sendActionsForControlEvents:UIControlEventValueChanged];
    }
    }
    최종 효과:

    정상 상황 리 셋.gif
    총결산
    이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기