2014-01-22 2 views
1

UICollectionView을 어떻게 구현합니까? 일단 사용자가 특정 지점을지나 탐색하면 돌아가서 해당 셀을 다시 볼 수 없다는 아이디어가 있습니다.오른쪽으로 스크롤 만하는 UICollectionView

해결책에 대한 내 시도는 컬렉션보기에서 제스처를 수신하고 요소에서 스 와이프가 발생하면 스크롤을 사용 중지하는 것입니다. 이것에 대한 명백한 문제는 사용자가 특정 셀을 잡아 끌 수 있다는 것입니다.

의견이 있으십니까?

+0

가능한 접근 방법 : 데이터 소스에서 화면의 왼쪽에있는 항목을 제거하고 때마다 reloadData 호출. 그래서 왼쪽의 셀은 항상 첫 번째 셀입니다. – rounak

답변

1

이 동작이 사용자에게 혼동을 줄 수 있다고 생각합니다.

사용자가 덜 혼란 스러울 수 있도록 탄력/수신 거부를 추가해야 할 수도 있습니다.

어쨌든, 난

이 UICollectionViewDelegate이 UIScrollViewDelegate에 부합하므로,이 – scrollViewWillBeginDragging:로있는 ScrollView의 개시 오프셋 (offset) 얻을 수있는

1/다음 – scrollViewDidScroll:에 새의 오프셋 (offset) x 값을 비교하는 것입니다 서브 클래스없이이를 달성하기 위해 두 가지 방법을 참조 . 새 offset.x의 값이 시작 오프셋 값보다 작 으면 0으로 설정하고 스크롤 뷰를 업데이트하십시오. 아이폰 OS에서 스크롤와 관성이 있기 때문에

#pragma mark - UIScrollViewDelegate 

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { 
    offset = scrollView.contentOffset; 
} 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {   

    CGPoint newOffset = scrollView.contentOffset; 

    if (newOffset.x < offset.x) { 
     // scrolling to the left, reset offset 
     [scrollView setContentOffset:offset]; 
    } 
} 

scrollViewDidScroll: 많은 시간이라고, 그래서 성능 문제가 발생할 수 있습니다. UIScrollViewDelegate에서 오프셋을 scrollViewWillEndDragging:withVelocity:targetContentOffset:으로 타겟팅하여 통화 수를 줄일 수 있습니다.

2/Or ou는 방금 오프셋을 애니메이션으로 다시 설정하는 scrollViewWillEndDragging:withVelocity:targetContentOffset: 메서드를 사용할 수 있습니다.

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { 

    CGPoint newOffset = scrollView.contentOffset; 

    if (newOffset.x < offset.x) { 
     // scrolling to the left, reset offset with animation 
     targetContentOffset->x = offset.x; 
    } 
} 

3/당신은 당신이 UIPanGestureRecognizer을 시도해 않았다 UISwipeGestureRecognizer의 이야기? 이것은 "단순한 파악과 끌기"입니다.

0

스크롤 오프셋을 기준으로 항목을 추가/제거하여 무한 스크롤보기를 구현하는 것과 같은 방법으로 구현할 수 있습니다. 당신의 오프셋 (offset) 과거 목록의 첫 번째 개체를두고있는 경우

    viewDidScroll: 방법 ( UICollectionViewDelegate)
  1. 확인을 무시
  2. 오프셋 (예. 당신은 여전히 ​​화면에 볼 수 있습니까?)
  3. 그것을 인 경우, 컬렉션보기에서 제거하십시오.

이 간단한 구현으로 인해 고르지 않은 애니메이션이 발생할 수 있습니다. 일단 작동하면 최적화를해야하지만 시작해야합니다.

0

또 다른 가능한 해결책은 왼쪽으로 스크롤하는 경우 스크롤을 시작하기 전에 모든 요소를 ​​지속적으로 "위치 변경"하여 해결할 수 있습니다.

최대 offsetX를 추적하여이를 달성 할 수 있으며 현재 오프셋 X가 최대 값보다 작은 경우 셀의 위치를 ​​변경하십시오. 그렇게하면 세포가 움직이지 않거나 스크롤 할 수 없다는 인상을 받게 될 것입니다. 그러나 실제로 스크롤됩니다.

0

제 경우에는 페이지가 매겨진 콜렉션 뷰가 있습니다. 콜렉션 뷰의 마지막 항목뿐만 아니라 각 페이지의 자동 감속에서도 감속해야 할 때주의해야합니다.

문제를 해결하기 위해 컬렉션보기가 "자동으로 이동"하는 동안 사용자 상호 작용을 사용 중지합니다. 여기에 코드

:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (!_isDragging) // <-- only do things if the user is dragging! 
     return; 

    CGPoint contentOffset = scrollView.contentOffset; 

    // If we move to the left 
    if (contentOffset.x < _contentOffset.x) 
    { 
     CGSize contentSize = scrollView.contentSize; 

     // If content offset is moving inside contentSize: 
     if ((contentOffset.x + scrollView.bounds.size.width) < contentSize.width) 
      scrollView.contentOffset= _contentOffset; 
    } 
    else  
    { 
     // Update the current content offset 
     _contentOffset = contentOffset; 
    } 
} 

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    _isDragging = YES;  
} 

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset 
{ 
    _isDragging = NO; 
} 

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    if (decelerate) 
    { 
     // If willDecelerate, stop user interaction! 
     _collectionView.userInteractionEnabled = NO; 
    } 
} 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    // Once deceleration is finished, enbale user interaction 
    _collectionView.userInteractionEnabled = YES; 

    // Set the new content offset 
    _contentOffset = scrollView.contentOffset; 
} 
+0

여기에 좋은 아이디어가 있지만 사용자가 스크롤 할 때'scrollViewDidScroll' 만 호출되기 때문에 _isDragging 논리는 필요 없습니다. – user2387855

+0

마지막 셀에있는 경우를 생각하고 콜렉션 뷰를 더 멀리 드래그한다고 가정 해보십시오. 드래그를 중지하면 컬렉션보기가 자동으로 콘텐츠 크기에 맞게 애니메이션으로 표시됩니다. 그러나이 애니메이션은 "금지 된"방향으로 수행되며 콜렉션 뷰를 명시 적으로 드래그 할 때 추적하지 않으면 컨텐츠 오프셋의 애니메이션이 '-scrollViewDidScroll'을 통해 중지됩니다. 내 코드에서 사용자가 드래그 할 때를 추적하고 있고 그렇지 않은 경우 콜렉션 뷰를 자유롭게 움직여 그 애니메이션을 허용합니다. – vilanovi

+0

오, 알았어. 무슨 뜻인지 알 겠어. 일반적으로 나는이 동작이 바람직하다는 것에 동의 하겠지만, 구현시 사용자가 정의한 물리, 모양 등을 가진 드래그 가능한 휠을 구현하기위한 노력이 적은 방법으로 'UICollectionView'를 사용하고 있습니다. 의미있는 것은 표시하지 않습니다. 데이터를 사용자에게 보냅니다. 나의 의도는 그것이 래칫처럼 행동하는 것이다. 그것의 움직임은 순전히 단방향이다. 나는 내 질문에 더 분명 했어야했다. – user2387855

관련 문제