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];
}
}
해결책을 찾았습니까? 나는 똑같은 것을 궁금해하고있다. –
아니, 최소한 내가 게시했을 때 가지고 있었던 것 이상의 아무것도, 작동하지만 느리고 조금 "glitchy". 나는 보통의 scrollView를 사용하여 마치 "collection"뷰 (그리드)처럼 보이게 만들었다. 그것은 완벽하게 작동합니다, 그것은 단지 내 목표 인 collectionView가 아닙니다! – Jordan
나는 'UIScrollView'에 초점을 맞추어 동일한 질문을했습니다. 당신이 찾고있는 답변이 있습니다 .. 사용자 rdelmar의'UICollectionView'를 사용합니다. 링크 : http://stackoverflow.com/a/15553973/406677 –