2010-03-02 4 views
3

설정 : UITableView입니다. 각 UITableViewCellUIScrollView입니다. 내가하려는 것은 UIScrollViews을 모두 스크롤하여 하나를 스크롤하면 모두 UIScrollViews이 동시에 스크롤되는 것처럼 보입니다.UIScrollViews 집합을 함께 스크롤하려면 어떻게해야합니까?

하위 셀 UITableView은 테이블 셀 내에 모두 UIScrollViews의 배열을 포함하고 있습니다. 그런 다음 TouchesBegan, TouchesMoved, TouchesCancelledTouchesEndedUITableView에서 배열의 모든 UIScrollViews으로 전달했습니다.

이것은 제대로 작동하지 않습니다. UIScrollViews 스크롤하지 마십시오! 이 문제를 해결할 수있는 유일한 방법은 scrollviews에 setContentOffset : 메서드를 호출하는 것입니다. 그러나이 방법은 UIScrollView의 스 와이프 및 감속 기능을 제공하지 않기 때문에 아주 나쁜 솔루션입니다.

내 터치 방법이 왜 UIScrollViews에 도착하지 않는지에 대한 아이디어가 있습니까? 또는 이것을 구현하는 더 좋은 방법은?

답변

2

부모보기 내부에 4 개의 scrollViews가있는 경우 "비슷한"작업을 수행했습니다. UIView 안에 scrollView를 배치했습니다.이 UIView는 모든 scrollViews를 추적 한 뷰인 parentView의 대리자를 전달 받았습니다. scrollVIew가 포함 된 UIView는 UIScrollViewDelegate 및이 메서드를 구현했습니다.

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

    [self.delegate scrolling:[self.scrollView contentOffSet]]; 

} 

지금 부모 뷰의 모든 scrollViews에 이런 짓을 :

- (void) scrolling:(CGFloat) offset { 

    for(UIScrollView *s in self) { 
     [s setContentOffset:offset animated:YES]; 
    } 
} 

그것은 물론 CPU에 부담을 조금이지만, 여러 뷰를 스크롤하는 것 그 어떤 상황에서도 :/

희망은 이것이 당신이 필요로하는 방향으로 뭔가가 있었으면 좋겠다.

추가 : 나는 그것을 작동하게하기 전에

나는 나에게 8 개 개의 다른 경로 및 대량 혼란을 많이했다. 나는 touchedBegan 접근법을 일찌감치 떨어 뜨 렸습니다. 사과 슬쩍, 가볍게 치기, 스크롤 알고리즘에 가까운 것을 쓸 방법이 없습니다.

tableview와 scrollview가 서로 다른 터치 이벤트를 "도용"할지 여부는 잘 모르겠지만 설명에서 알 수 있듯이 그 부분을 작동 시켰습니다.

CPU 사용을 쉽게하기위한 후속 아이디어. 각 스크롤 뷰를 셀에 추가하고 해당 태그를 14로 설정합니다. 스크롤 할 때 모든 보이는 셀만 요청하면 viewWithTag = 14를 요청하고 이에 대한 contentOffset을 설정합니다. 콘텐츠 오프셋을 전역으로 저장하여 cellForRowAtIndexPath에서 화면으로 스크롤되는 셀에 지정할 수 있습니다.

offset을 전역 속성으로 설정하고 cellForRowAtIndexPath에서 태그가 14 인 뷰를 찾고 해당 오프셋을 설정합니다. 이 방법을 사용하면 scroll에 대한 참조가 필요하지 않은 경우에만 대리자를 볼 수 있습니다.

+0

아 흥미로운 솔루션을. 나는 일단 집에 가면 이것을 시도 할 것이다. 나는 scrollViewDidScroll을 기반으로 setContentOffset을 사용하는 것을 생각하지 않았습니다. 나는 그것을 기반으로했습니다. 설정이 애니메이션으로 표현되었다고 상상할 수 있듯이 : 각 터치로 인해 대량 카오스가 발생했습니다. –

+0

리키, 좋은 제안, 오늘 밤에 시도해 보겠습니다. 감사!! –

+0

나는 전에이 솔루션을 거의 정확히 수행 했으므로 훌륭하게 작동합니다. 유일한 변화는 애니메이션이었습니다 : 아니오. 'scrollViewDidScroll :'은 스크롤하는 동안 매우 자주 호출 될 것이므로 나머지는 어쨌든 명시 적으로 설정되지 않은 상태로 애니메이션으로 표시됩니다. 이렇게하면 일부 CPU를 절약하여 사용자에게 동일한 경험을 제공 할 수 있습니다. –

6

좋아, 잘 했어. 팁 Ricki에 감사드립니다!

Ricki의 솔루션에 추가 할 두 가지 사항, 무한 루프를 방지하려면 scrollView의 추적 또는 속성 드래그 여부를 확인해야합니다.이것은 실제로 드래그되는 ScrollView 만 델리게이트를 호출하는 것을 보장합니다. 또한

- (void)scrollViewDidScroll:(UIScrollView *) theScrollView { 
     if (theScrollView.dragging || theScrollView.tracking) 
       [self.delegate scrolling:[theScrollView contentOffSet]]; 
} 

는, 대리인의 스크롤 방식으로,이 초기 슬쩍 업데이트지고 다른 scrollviews 사이의 지연을 제거있어, NO로 애니메이션을 설정합니다. 다르게 UIScrollViews 크기의하고 페이징을 사용하는 경우

+0

당신은 정말 빨리 꼬임을 풀어 준 것을 환영합니다. 나의 초기 도전은 당신과는 조금 달랐지 만 그 해결책이 다른 디자인에도 적용 가능하다는 소식을 듣고 기뻤습니다. – RickiG

+0

와우! 매력처럼 일했다. – Jirune

0

이 잘 작동 :

- (void)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView { 
    #pragma unused(_scrollView) 
    categoryPageControlIsChangingPage = NO; 
    for (UIImageView *iv in [categoryScrollView subviews]) { 
     iv.alpha = (iv.tag != categoryPageControl.currentPage+1)?0.5f:1.0f; 
     ILogPlus(@"%i %i", iv.tag, categoryPageControl.currentPage+1); 
    } 
    [self scrolling:_scrollView]; 
} 

- (void)scrolling:(UIScrollView *)sv { 
    CGFloat offsetX = sv.contentOffset.x; 
    CGFloat ratio = offsetX/sv.contentSize.width; 

    if ([sv isEqual:categoryScrollView]) { 
     [categoryScrollViewLarge setContentOffset:CGPointMake(ratio*categoryScrollViewLarge.contentSize.width, 0) animated:YES]; 
    }else { 
     [categoryScrollView setContentOffset:CGPointMake(ratio*categoryScrollView.contentSize.width, 0) animated:YES]; 
    } 
} 
관련 문제