6

무한 스크롤 달력을 구현 중입니다. 내 문제는 탐색 막대의 제목으로 현재 달을 설정하고 스크롤하는 동안 업데이트해야한다는 것입니다. 한 번 섹션 제목보기를 전달하면 제목이 탐색 모음에서 업데이트됩니다.UICollectionView에서 새 섹션으로 스크롤하는 것을 감지하는 방법은 무엇입니까?

가능한 해결책은 - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath이라는 메서드에서보기 제목을 설정하여 새 섹션 머리글을 계산할 때 제목도 업데이트되도록하는 것입니다. 이 문제는 새 섹션이 페이지의 맨 아래에있을 때 제목이 변경된다는 것입니다.

Currently displaying the Section Header as title, not optimal

사용자가 그것을 스크롤되면 UICollectionView의 "현재 섹션"을 알 수있는 방법이 있습니까? 또는 현재 솔루션을 개선 할 수있는 방법을 생각할 수 있습니까?

이 게시물의 독자를 돕기 위해이 질문에 대한 내 자신의 샘플 코드를 GitHub repo에 게시했습니다. 방법 viewForSupplementaryElementOfKind 라인 아래

+0

원하는 동작을 얻을 수있는 해결책을 찾았습니까? – Joey

+0

안녕하세요 @ 조이 내 대답을 확인하십시오. – KDeogharkar

답변

0

변화 : 이것에

self.title = [df stringFromDate:[self dateForFirstDayInSection:indexPath.section]]; 

:

if(![[self dateForFirstDayInSection:indexPath.section-1] isKindOfClass:[NSNull class]]){ 
     self.title = [df stringFromDate:[self dateForFirstDayInSection:indexPath.section-1]]; 
} 

그것은 당신을 도울 것입니다 바랍니다.

+0

예이 특정 문제가 해결되었습니다. 감사! – maggix

+0

다음 헤더가 화면에 표시되지 않을 때 작동하지 않으며 위로 스크롤하면 이전 섹션이 표시되기 전에 제목이 변경됩니다. – Joey

0

예, 문제는 footer 및 header가 visibleCells 컬렉션에 존재하지 않는다는 것입니다. 섹션 머리글/바닥 글에 대한 스크롤을 감지하는 다른 방법이 있습니다. 거기에 컨트롤을 추가하고 rect를 찾으십시오. 이처럼 : 나는 당신이 사용자가 제목을 업데이트하기 위해 섹션 헤더를지나 스크롤 할 때 알 수있는 것이다 알고리즘을 숙고되었고, 일부 실험 후 나는를 구현하는 방법을 알아 낸

func scrollViewDidScroll(scrollView: UIScrollView) { 

    if(footerButton.tag == 301) 
    { 
     let frame : CGRect = footerButton.convertRect(footerButton.frame, fromView: self.view) 
     //some process for frame 
    } 


} 
2

원하는 행동.

기본적으로 스크롤 위치가 변경 될 때마다 사용자가 어떤 섹션에 있는지 파악하고 제목을 업데이트해야합니다. UIScrollViewDelegatescrollViewDidScroll을 통해 이렇게 할 수 있습니다. 컬렉션보기는 스크롤보기임을 기억하십시오. 모든 헤더를 반복하고 음의 오프셋을 가지지 않고 현재 스크롤 위치에 가장 가까운 것을 찾으십시오. 이를 위해 각 섹션 머리글의 위치 배열을 저장하는 속성을 사용했습니다. 헤더가 생성되면 배열의 해당 위치에 해당 위치를 저장합니다. 스크롤 위치 (또는 상기 헤더의 인덱스 위치)에 가장 가까운 헤더를 찾았 으면 탐색 바의 제목을 적절한 제목으로 업데이트하기 만하면됩니다.

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]; 
} 

사용자가 섹션의 헤더를지나 스크롤하면 탐색 막대의 제목이 올바르게 업데이트됩니다.다시 위로 스크롤하면 올바르게 업데이트됩니다. 또한 첫 번째 섹션을지나 스크롤하지 않은 경우에도 제목을 올바르게 설정합니다. 그러나 회전을 잘 처리하지 못합니다. 또한 동적 내용이있는 경우 잘 작동하지 않아 헤더보기의 저장된 위치가 정확하지 않을 수 있습니다. 특정 섹션으로 건너 뛰기를 지원하는 경우 사용자는 이전 섹션의 섹션 헤더가 아직 생성되지 않은 섹션으로 이동하며 섹션 헤더가 탐색 바 아래에 있도록 충분히 크지 않습니다 (마지막 섹션 아마도) 잘못된 제목이 탐색 모음에 표시됩니다.

누구든지이 기능을 개선하여 더 효율적으로 만들거나 다른 방법으로 더 잘 수행 할 수 있다면 그에 맞게 답변을 업데이트하겠습니다.

+0

안녕 조이, 정교한 대답 주셔서 감사합니다! – maggix