4

iOS 6의 UICollectionView에서 무한 가로 및 세로 스크롤링을 구현하려고합니다. 작동하도록 관리했지만 느리고 고르지 않습니다.iOS 6의 UICollectionView에서 무한 가로 및 세로 스크롤을 구현하는 방법은 무엇입니까?

StackOverflow에서 비슷한 질문이 있지만 그 중 가장 깊은 것은 Apple의 WDC 비디오를 따르고 스크롤 대신 컬렉션으로 구현하는 것입니다. 나는이 문제와 비슷한 질문을 한 다른 의견을 토대로 내 디자인에 기반을 두었지만 아직도 부드럽게 보이지는 못한다.

나는 기본적으로 쇼 그리드를 선물하고 어떤 방향으로 스크롤 할 수있게 해주는 HBO GO iPad 앱의 동작을 모방하려고 노력하고 있습니다. 끝까지 다가 가면 쇼를 감싸는 것처럼 느낍니다. 당신은 무한히 스크롤하고 있습니다.

내가 한 것은 격자에서 UICollectionView 셀을 정렬하는 사용자 지정 레이아웃을 만드는 것입니다. 그런 다음 UICollectionView를 서브 클래 싱하여 layoutSubviews 메서드를 덮어 썼고 Eliza의 WDC 비디오처럼 reecenterIfNecessary 함수를 만들었습니다. 이 작품과 무한 "스크롤"얻을하지만 내용이 변경되지 않습니다.

그래서 뷰 ​​컨트롤러를 가리키는 대리자를 만들었습니다. 랩이있을 때마다 위임자에게 데이터 소스를 이동하도록 알려줍니다.하지만 UICollectionView에는 반영되지 않으므로 [self reloadData]는 뷰를 새로 고침하고 모든 것이 "작동"합니다. 나는 무한 스크롤을 얻는다.

하지만 reloadData를 호출하기 때문에 지연이 눈에 띄고 스크롤바가 "콘텐츠"가 "다시로드 됨"에서 깜박입니다. 이것은 받아 들일 수없는 것이고 나는 그걸 해결하는 방법을 알아낼 수 없다!

도움을 주시면 감사하겠습니다. 도움이 될 경우 recenterIfNecessary 함수가 포함되었습니다.

- (void) recenterIfNecessary{ 

CGPoint currentOffset = [self contentOffset]; 
CGFloat contentHeight = [self contentSize].height; 
CGFloat contentWidth = [self contentSize].width; 

//calc center point which would leave same amount of content on both sides 
CGFloat centerY = (contentHeight - [self bounds].size.height)/2.0; 
CGFloat centerX = (contentWidth - [self bounds].size.width)/2.0; 

if (currentOffset.x == 0 && currentOffset.y == 0){ 
    //assume this is first load. Set offset to content center. 
    self.contentOffset = CGPointMake(centerX, centerY); 
    return; 
} 

//distance from center is abs of where we are and where we want to be: 
CGFloat offsetY = centerY-currentOffset.y; 
CGFloat offsetX = centerX-currentOffset.x; 

//now we decide if we want to recenter 
int deltaX = 0; 
int deltaY = 0; 
if (fabs(offsetX) > CELL_WIDTH){ 

    if (offsetX < 0){ 
     deltaX = -ceil(offsetX/CELL_WIDTH); 
    }else{ 
     deltaX = -floor(offsetX/CELL_WIDTH); 
    } 
    offsetX += offsetX + (CELL_WIDTH * deltaX); 
    self.contentOffset = CGPointMake(centerX, currentOffset.y); 
} 
if (fabs(offsetY) > CELL_HEIGHT){ 

    if (offsetY < 0){ 
     deltaY = -ceil(offsetY/CELL_HEIGHT); 
    }else{ 
     deltaY = -floor(offsetY/CELL_HEIGHT); 
    } 

    offsetY += offsetY + (CELL_HEIGHT * deltaY); 

    self.contentOffset = CGPointMake(currentOffset.x, centerY); 

} 
if (fabs(offsetX) > CELL_WIDTH || fabs(offsetY) > CELL_HEIGHT){ 
    //move subviews to reflect scrolling 
    for (UIView *subview in self.subviews) { 
     CGPoint center = subview.center; 
     center.x += offsetX; 
     center.y += offsetY; 
     subview.center = center; 
    } 

    if ([self.infiniteDataModelDelegate conformsToProtocol:@protocol(InfiniteDataModelProtocol)]){ 
     //moves the data model to reflect "scrolling" 
     [self.infiniteDataModelDelegate contentDidChangeModelDeltaX:deltaX deltaY:deltaY]; 
    } 
    [self reloadData]; 
} 
} 
+0

해결책을 찾았습니까? 나는 똑같은 것을 궁금해하고있다. –

+0

아니, 최소한 내가 게시했을 때 가지고 있었던 것 이상의 아무것도, 작동하지만 느리고 조금 "glitchy". 나는 보통의 scrollView를 사용하여 마치 "collection"뷰 (그리드)처럼 보이게 만들었다. 그것은 완벽하게 작동합니다, 그것은 단지 내 목표 인 collectionView가 아닙니다! – Jordan

+0

나는 'UIScrollView'에 초점을 맞추어 동일한 질문을했습니다. 당신이 찾고있는 답변이 있습니다 .. 사용자 rdelmar의'UICollectionView'를 사용합니다. 링크 : http://stackoverflow.com/a/15553973/406677 –

답변

0

이 방법을 시도해 보셨습니까?

-(void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath{ 
    if ([self.products count] > 8 && indexPath.row == [self.products count] - 8) { 
     [self loadMoreItems]; 
     [self.collectionView reloadData]; 

    } 
} 
1

나는 함께 모든 방향으로 무한 스크롤 뷰를 제공하는 라이브러리를 뒀다. 사용자가 스크롤 할 때 프레임 워크는 타일을 배치하고 대리인에게 타일의 프레젠테이션을 설정할 수 있도록 알립니다. 성능 측면에서 볼 때 프레임 워크는 지연이 없음 : 전체 60fps를 제공합니다.

Flickr 이미지를 무한히 움직이는 벽에 표시하는 샘플 앱이있는 프레임 워크는 여기 https://github.com/vovagalchenko/scroll-for-days입니다. 또한 작동중인 샘플 앱의 동영상은 다음과 같습니다. https://cloud.box.com/s/d6bgvlot175au5a3jeh5

관련 문제