2011-06-13 5 views
2

stackoverflow에서 보았지만 정확하게 대답하는 답변을 찾을 수 없습니다. 내가 뭔가를 놓친 경우 올바른 질문을 가르쳐주십시오. 여기 UIScrollView를 터치하여 세로로 스크롤하고 프로그래밍 방식으로 가로로 배열합니다.

내 시나리오입니다 -

내가 원래 내 수직 창 크기를 설정 한 경우가 있었다, 그래서 단순히이 수행하여 나를 완전히 스크롤을 제한하기가 쉬웠다 -

CGRect scrollContainer = CGRectMake(0, 0, 320, 440); 
self.baseView = [[UIScrollView alloc] initWithFrame:scrollContainer]; 
self.baseView.contentSize = CGSizeMake(6400, 440); 
self.baseView.bounces = NO; 
self.baseView.pagingEnabled = NO; 
self.baseView.scrollEnabled = NO; 

을 휴대 전화의 움직임을 바탕으로, 그때 프로그래밍 스크롤 할 수 있었다 -

CGPoint scrollOffset = CGPointMake(x*20, 0); 
[self.baseView setContentOffset:scrollOffset]; 

을 내 새로운 요구 사항에서, 수직 콘텐츠 증가는 크게 그래서 근래 것 난 아직도 수평 프로그램 스크롤되지만 사용자에게 터치에 의해 만 세로로 스크롤 할 수있는 능력을주고 싶다 그래서

self.baseView.contentSize = CGSizeMake(6400, 4400); 

과 같은 전자 contentSize. 그래서 나는 scrollEnabled = YES라고 말해야한다고 가정합니다. 그러나이를 통해 사용자는 양방향으로 스크롤 할 수 있습니다.

터치 이벤트를 캡처하고 무시해야합니까? 수평 스크롤인지 수직 스크롤인지 어떻게 알 수 있습니까? 대각선 스크롤 동작을하면 어떻게됩니까?

나는이 시점에서 조금 우둔해 어떤 입력이라도 크게 감사 할 것입니다.

답변

4

UIScrollViews 중첩을 통해이 작업을 수행 할 수 있습니다.

내부 스크롤보기의 실제 내용은 contentSize이고 실제 크기는 화면 너비이고 높이는 스크롤이 비활성화 된 contentSize 입니다.

바깥 쪽 스크롤보기는 바깥 쪽 스크롤보기의 크기와 같아야하며 실제 크기는 스크롤링이 활성화 된 화면 크기입니다.

이 방법을 사용하면 내부 뷰에서 프로그래밍 방식으로 수평 오프셋을 제어하면서 사용자가 외부 뷰를 위아래로 스크롤 할 수 있습니다.

다소 복잡하지만 적어도 하위 클래스를 만들 필요는 없습니다. : D

(또한 iOS 만 작동합니다 3.0 이상)하지만 문제)

[ "중첩 스크롤 뷰"섹션 "스크롤보기 iOS 용 프로그래밍 안내서"를 참조]

될 것 같지 않습니다
+0

나는 잘 모르겠다. 세로로 스크롤하려면 스크롤 뷰 중 하나의 콘텐츠 크기가 화면 크기보다 커야합니다. 맞습니까? 그것은 내부 스크롤보기 또는 외부입니까? – Kal

+0

나는 이것을 오늘 저녁에 시도하고 피드백을 줄 것이다. 대답을 감사하십시오. innerscrollview = 스크롤이 비활성화 된 전체 콘텐츠 크기 outerscrollview.width = 화면 너비 .. outerscrollview에 innnerscrollview를 추가하고 outerscrollview에 대해 화면 상호 작용을 사용하도록 설정합니다. 그게 맞는 것 같니? – Kal

+2

@Kal 내부 scrollView에는 화면 너비 너비 만 있지만 contentSize는 전체 contentSize입니다. 높이는 contentSize.height입니다. 따라서 바깥 쪽 터치 가능 scrollView는 내부 scrollView * (contentSize = innerScrollView.size)를 스크롤하고 사용자가 변경할 수 없기 때문에 내부 scrollView의 가로 contentOffset을 코드에서 제어 할 수 있습니다. – fzwo

4

UISwipeGestureRecognizer을 사용하여 일련의 터치 이벤트를 세로 또는 가로 스 와이프로 인식 할 수 있습니다. 당신의 handleGesture: 방법에서

// ensure that automatic scrolling is not enabled 
scrollView.scrollEnabled = NO; 

UISwipeGestureRecognizer *swipeRecognizer = [[UISwipeGestureRecognizer alloc] 
              initWithTarget:self 
              action:@selector(handleGesture:)]; 
swipeRecognizer.direction = UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown; 
[scrollView addGestureRecognizer:swipeRecognizer]; 
[swipeRecognizer release]; 

, 이제 적절하게 scrollOffset을 조정할 수 있습니다. 자세한 내용은 UIGestureRecognizer을 참조하십시오.

3

또한 두 개의 scrollViews가 여기에 대한 답이라고 생각합니다.상자를 중첩하지 않으려면 컨트롤러에 데이터를 연결하십시오.

콘텐츠를 보유하고 사용자 상호 작용이 사용 중지 된 스크롤보기가 하나 있는데, contentScrollView이라고하고, 같은 크기의 하나의 보이지 않는 scrollView를 맨 위에 배치하십시오. , interactionScrollView. 양쪽 모두의 위임 컨트롤러에서 구현하면

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (scrollView == interactionScrollView) 
    { 
     CGPoint offset = CGPointMake(yourProgrammaticallySetHorizontalOffset,interactionScrollView.contentOffset.y); 
     [contentScrollView setContentOffset:offset]; 
    } 
} 

위와 같은 방법으로 연결할 수 있습니다.

는 일반적으로있는 ScrollView로있는 contentView를 넣어하지만 CGPointMake(scrollView.size.width,content.size.height)로있는 ScrollView의 contentSize을 설정 : 당신은 아마 정말하지 않는 수평 스크롤이 필요하기 때문에, 당신은 단지 내용을 설정할

+0

답변 해 주셔서 감사합니다. 나는 오늘 이것을 시험해보고 피드백을 줄 것이다. – Kal

1

또 다른 가능성은, 오프셋입니다. 이것은 scrollView가 수평 적으로 스크롤하지 않음을 의미합니다.

코드에서 가로로 콘텐츠를 옮길 수 있습니다 (content.frame = CGRectOffset(content.frame, yourPreferredOffset, 0)).

나는 이것을 테스트하지는 못했지만 작동 할 것이고 scrollView 하나만 있으면됩니다. 또한 갑자기 내용이 변경되는 대신 스크롤처럼 보일 수 있도록 애니메이션에 프레임을 넣으면됩니다.

관련 문제