[ios] UITableView가 iPhone에서 맨 아래로 스크롤되었는지 확인하는 방법

UITableView더 많은 콘텐츠를로드하고 표시하기 위해 맨 아래로 스크롤 한시기를 알고 싶습니다. 대리자 또는 테이블이 맨 아래로 스크롤 된시기를 컨트롤러에 알리는 다른 항목과 같은 것입니다.

누구든지 이것을 알고 있습니까, 제발 도와주세요, 미리 감사드립니다!



답변

가장 좋은 방법은 화면 하단에있는 지점을 테스트하고 사용자가 스크롤 할 때마다이 메서드 호출을 사용하는 것입니다 ( scrollViewDidScroll).

- (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point

화면 하단 근처의 지점을 테스트 한 다음 반환되는 indexPath를 사용하여 해당 indexPath가 마지막 행인지 확인한 다음 해당하는 경우 행을 추가합니다.


답변

tableview 대리자에서 다음과 같이하십시오.

ObjC :

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView {
    CGPoint offset = aScrollView.contentOffset;
    CGRect bounds = aScrollView.bounds;
    CGSize size = aScrollView.contentSize;
    UIEdgeInsets inset = aScrollView.contentInset;
    float y = offset.y + bounds.size.height - inset.bottom;
    float h = size.height;
    // NSLog(@"offset: %f", offset.y);   
    // NSLog(@"content.height: %f", size.height);   
    // NSLog(@"bounds.height: %f", bounds.size.height);   
    // NSLog(@"inset.top: %f", inset.top);   
    // NSLog(@"inset.bottom: %f", inset.bottom);   
    // NSLog(@"pos: %f of %f", y, h);

    float reload_distance = 10;
    if(y > h + reload_distance) {
        NSLog(@"load more rows");
    }
}

빠른:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let offset = scrollView.contentOffset
    let bounds = scrollView.bounds
    let size = scrollView.contentSize
    let inset = scrollView.contentInset
    let y = offset.y + bounds.size.height - inset.bottom
    let h = size.height
    let reload_distance:CGFloat = 10.0
    if y > (h + reload_distance) {
        print("load more rows")
    }
}


답변

수정 된 neoneyes가 약간 대답합니다.

이 답변 은 손가락을 뗄마다 이벤트가 한 번만 트리거되기를 원하는 사용자를 대상 으로합니다 .

일부 콘텐츠 제공 업체 (웹 서비스, 핵심 데이터 등)에서 더 많은 콘텐츠를로드 할 때 적합합니다. 이 접근 방식은 웹 서비스의 응답 시간을 고려하지 않습니다.

- (void)scrollViewDidEndDragging:(UIScrollView *)aScrollView
                  willDecelerate:(BOOL)decelerate
{
    CGPoint offset = aScrollView.contentOffset;
    CGRect bounds = aScrollView.bounds;
    CGSize size = aScrollView.contentSize;
    UIEdgeInsets inset = aScrollView.contentInset;
    float y = offset.y + bounds.size.height - inset.bottom;
    float h = size.height;

    float reload_distance = 50;
    if(y > h + reload_distance) {
        NSLog(@"load more rows");
    }
}


답변

이 메서드를에 추가하십시오 UITableViewDelegate.

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat height = scrollView.frame.size.height;

    CGFloat contentYoffset = scrollView.contentOffset.y;

    CGFloat distanceFromBottom = scrollView.contentSize.height - contentYoffset;

    if(distanceFromBottom < height)
    {
        NSLog(@"end of the table");
    }
}


답변

위의 답변 중 어느 것도 도움이되지 않았으므로 이것을 생각해 냈습니다.

- (void)scrollViewDidEndDecelerating:(UIScrollView *)aScrollView
{
    NSArray *visibleRows = [self.tableView visibleCells];
    UITableViewCell *lastVisibleCell = [visibleRows lastObject];
    NSIndexPath *path = [self.tableView indexPathForCell:lastVisibleCell];
    if(path.section == lastSection && path.row == lastRow)
    {
        // Do something here
    }
}


답변

사용 – tableView:willDisplayCell:forRowAtIndexPath:( UITableViewDelegate방법)

indexPath데이터 배열의 항목 (또는 테이블보기에 사용하는 데이터 소스)과 간단히 비교하여 마지막 요소가 표시되는지 확인하십시오.

문서 : http://developer.apple.com/library/ios/documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UITableViewDelegate/tableView:willDisplayCell:forRowAtIndexPath :


답변

UITableView(A)의 서브 클래스 UIScrollView, 및 UITableViewDelegate을 준수합니다 UIScrollViewDelegate. 따라서 테이블 뷰에 연결하는 델리게이트는와 같은 이벤트를 가져 scrollViewDidScroll:오고 contentOffset테이블 뷰 와 같은 메서드를 호출 하여 스크롤 위치를 찾을 수 있습니다.