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
데이터 배열의 항목 (또는 테이블보기에 사용하는 데이터 소스)과 간단히 비교하여 마지막 요소가 표시되는지 확인하십시오.
답변
UITableView
(A)의 서브 클래스 UIScrollView
, 및 UITableViewDelegate
을 준수합니다 UIScrollViewDelegate
. 따라서 테이블 뷰에 연결하는 델리게이트는와 같은 이벤트를 가져 scrollViewDidScroll:
오고 contentOffset
테이블 뷰 와 같은 메서드를 호출 하여 스크롤 위치를 찾을 수 있습니다.