원하는 행동.
기본적으로 스크롤 위치가 변경 될 때마다 사용자가 어떤 섹션에 있는지 파악하고 제목을 업데이트해야합니다. UIScrollViewDelegate
의 scrollViewDidScroll
을 통해 이렇게 할 수 있습니다. 컬렉션보기는 스크롤보기임을 기억하십시오. 모든 헤더를 반복하고 음의 오프셋을 가지지 않고 현재 스크롤 위치에 가장 가까운 것을 찾으십시오. 이를 위해 각 섹션 머리글의 위치 배열을 저장하는 속성을 사용했습니다. 헤더가 생성되면 배열의 해당 위치에 해당 위치를 저장합니다. 스크롤 위치 (또는 상기 헤더의 인덱스 위치)에 가장 가까운 헤더를 찾았 으면 탐색 바의 제목을 적절한 제목으로 업데이트하기 만하면됩니다.
NSNumber *position = [NSNumber numberWithFloat:headerView.frame.origin.y + headerView.frame.size.height];
[self.sectionHeaderPositions replaceObjectAtIndex:indexPath.section withObject:position];
scrollViewDidScroll:
을에서 : collectionView:viewForSupplementaryElementOfKind:atIndexPath:
에서
self.sectionHeaderPositions = [[NSMutableArray alloc] init];
for (int x = 0; x < self.sectionTitles.count; x++) {
[self.sectionHeaderPositions addObject:[NSNull null]];
}
는, 생성 된 헤더보기의 위치와 배열을 업데이트 : viewDidLoad
에서
, 당신은 각 섹션 NSNull
으로 배열 속성을 채우기 , 계산을 수행하여 해당 제목에 적합한 제목을 결정하십시오.
CGFloat currentScrollPosition = self.collectionView.contentOffset.y + self.collectionView.contentInset.top;
CGFloat smallestPositiveHeaderDifference = CGFLOAT_MAX;
int indexOfClosestHeader = NSNotFound;
//find the closest header to current scroll position (excluding headers that haven't been reached yet)
int index = 0;
for (NSNumber *position in self.sectionHeaderPositions) {
if (![position isEqual:[NSNull null]]) {
CGFloat floatPosition = position.floatValue;
CGFloat differenceBetweenScrollPositionAndHeaderPosition = currentScrollPosition - floatPosition;
if (differenceBetweenScrollPositionAndHeaderPosition >= 0 && differenceBetweenScrollPositionAndHeaderPosition <= smallestPositiveHeaderDifference) {
smallestPositiveHeaderDifference = differenceBetweenScrollPositionAndHeaderPosition;
indexOfClosestHeader = index;
}
}
index++;
}
if (indexOfClosestHeader != NSNotFound) {
self.currentTitle.text = self.sectionTitles[indexOfClosestHeader];
} else {
self.currentTitle.text = self.sectionTitles[0];
}
사용자가 섹션의 헤더를지나 스크롤하면 탐색 막대의 제목이 올바르게 업데이트됩니다.다시 위로 스크롤하면 올바르게 업데이트됩니다. 또한 첫 번째 섹션을지나 스크롤하지 않은 경우에도 제목을 올바르게 설정합니다. 그러나 회전을 잘 처리하지 못합니다. 또한 동적 내용이있는 경우 잘 작동하지 않아 헤더보기의 저장된 위치가 정확하지 않을 수 있습니다. 특정 섹션으로 건너 뛰기를 지원하는 경우 사용자는 이전 섹션의 섹션 헤더가 아직 생성되지 않은 섹션으로 이동하며 섹션 헤더가 탐색 바 아래에 있도록 충분히 크지 않습니다 (마지막 섹션 아마도) 잘못된 제목이 탐색 모음에 표시됩니다.
누구든지이 기능을 개선하여 더 효율적으로 만들거나 다른 방법으로 더 잘 수행 할 수 있다면 그에 맞게 답변을 업데이트하겠습니다.
원하는 동작을 얻을 수있는 해결책을 찾았습니까? – Joey
안녕하세요 @ 조이 내 대답을 확인하십시오. – KDeogharkar