행이 없는 섹션으로 UITableView를 스크롤하려면 어떻게 해야 합니까?
-
03-07-2019 - |
문제
제가 작업 중인 앱에는 행이 0개 포함된 섹션을 포함할 수 있는 일반 스타일 UITableView가 있습니다.scrollToRowAtIndexPath:atScrollPosition:animated를 사용하여 이 섹션으로 스크롤할 수 있기를 원합니다.하지만 하위 행이 부족하여 이 섹션으로 스크롤하려고 하면 오류가 발생합니다.
Apple의 캘린더 애플리케이션은 이 작업을 수행할 수 있습니다. 목록 보기에서 캘린더를 볼 때 캘린더에 오늘 이벤트가 없으면 오늘 빈 섹션이 삽입되고 도구 모음의 오늘 버튼을 사용하여 스크롤할 수 있습니다. 화면 하단에 있습니다.제가 아는 한 Apple은 맞춤형 UITableView를 사용하고 있거나 비공개 API를 사용하고 있습니다.
내가 생각할 수 있는 유일한 해결 방법은 높이가 0픽셀인 빈 UITableCell을 삽입하고 해당 위치로 스크롤하는 것입니다.하지만 높이가 다양한 셀을 갖는 것은 스크롤 성능에 좋지 않다는 것을 제가 이해하고 있습니다.그래도 어쨌든 해볼게, 어쩌면 성능 히트도 나쁘지 않을 것 같다.
업데이트
이에 대한 해결책이 없는 것 같아서 Apple에 버그 보고서를 제출했습니다.이것이 귀하에게도 영향을 미치는 경우 rdar://problem/6263339(레이더 링크 열기) 이 문제를 더 빨리 해결하고 싶다면.
업데이트 #2
이 문제에 대한 적절한 해결 방법이 있습니다. 아래 답변을 살펴보세요.
해결책
업데이트 :이 버그는 iOS 3.0에서 고정 된 것 같습니다. 다음을 사용할 수 있습니다 NSIndexPath
0 행이 포함 된 섹션으로 스크롤하려면 :
[NSIndexPath indexPathForRow:NSNotFound inSection:section]
2.X SDK를 사용하여 여전히 프로젝트를 유지하고있는 사람을 위해 원래 해결 방법을 여기에 남겨 두겠습니다.
괜찮은 해결 방법을 찾았습니다.
CGRect sectionRect = [tableView rectForSection:indexOfSectionToScrollTo];
[tableView scrollRectToVisible:sectionRect animated:YES];
위의 코드는 테이블 뷰를 스크롤하여 원하는 섹션이 표시되지만 반드시 가시 영역의 상단 또는 하단에있는 것은 아닙니다. 섹션이 상단에 있도록 스크롤하려면 다음을 수행합니다.
CGRect sectionRect = [tableView rectForSection:indexOfSectionToScrollTo];
sectionRect.size.height = tableView.frame.size.height;
[tableView scrollRectToVisible:sectionRect animated:YES];
원하는 섹션을 가시 영역의 하단 또는 중간으로 스크롤하려면 SectionRect를 수정하십시오.
다른 팁
이것은 오래된 질문이지만 Apple은 섹션에 행이 없는 충돌 버그를 해결하거나 도움이 되는 항목을 아직 추가하지 않았습니다.
저는 새 섹션을 추가할 때 가운데로 스크롤해야 했기 때문에 이제 다음 코드를 사용합니다.
if (rowCount > 0) {
[self.tableView scrollToRowAtIndexPath: [NSIndexPath indexPathForRow: 0 inSection: sectionIndexForNewFolder]
atScrollPosition: UITableViewScrollPositionMiddle
animated: TRUE];
} else {
CGRect sectionRect = [self.tableView rectForSection: sectionIndexForNewFolder];
// Try to get a full-height rect which is centred on the sectionRect
// This produces a very similar effect to UITableViewScrollPositionMiddle.
CGFloat extraHeightToAdd = sectionRect.size.height - self.tableView.frame.size.height;
sectionRect.origin.y -= extraHeightToAdd * 0.5f;
sectionRect.size.height += extraHeightToAdd;
[self.tableView scrollRectToVisible:sectionRect animated:YES];
}
마음에 드셨으면 좋겠습니다. 보시다시피 Mike Akers의 코드를 기반으로 하지만 상단이 아닌 가운데로 스크롤하는 계산을 수행합니다.고마워요 마이크 - 당신은 스타예요.
동일에 대한 신속한 접근법 :
if rows > 0 {
let indexPath = IndexPath(row: 0, section: section)
self.tableView.setContentOffset(CGPoint.zero, animated: true)
self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
}
else {
let sectionRect : CGRect = tableView.rect(forSection: section)
tableView.scrollRectToVisible(sectionRect, animated: true)
}
섹션에서 행이없는 경우 이것을 사용하십시오
let indexPath = IndexPath(row: NSNotFound, section: section)
tableView.scrollToRow(at: indexPath, at: .middle, animated: true)
나는 빈 줄이 아마도 그곳에가는 유일한 방법이라고 생각합니다. "빈"행에 유용한 것을 표시 할 수 있도록 UI를 재 설계 할 수 있습니까?
나는 그것을 시도하고 성능이 어떤지 확인한다고 말합니다. 그들은 귀하의 목록 항목에서 투명한 하위 뷰를 사용하는 것에 대한 끔찍한 경고를 제공하며, 내 응용 프로그램에서 그다지 중요하다는 것을 알지 못했습니다.