행이 없는 섹션으로 UITableView를 스크롤하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/159821

  •  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를 재 설계 할 수 있습니까?

나는 그것을 시도하고 성능이 어떤지 확인한다고 말합니다. 그들은 귀하의 목록 항목에서 투명한 하위 뷰를 사용하는 것에 대한 끔찍한 경고를 제공하며, 내 응용 프로그램에서 그다지 중요하다는 것을 알지 못했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top