Do Not Think!!!

Posted
Filed under 01010101
아이폰 기본 앱을 보면,
스크롤을 아래로 내린 상태에서 아이폰의 상단 상태바를 터치하면,
스크롤이 맨 위로 올라가는 기능이 있습니다.

이 기능은 아이폰 기본 기능인데,
(The scroll-to-top gesture is a tap on the status bar)
개발을 하다보면 이 기능이 동작이 안하는 경우가 있습니다.

보통 별도로 탭을 구현하는 경우 이 기능이 동작 안하는 경우가 많습니다.

이 기능은
UIScrollView 의 scrollsToTop 속성이 YES 로 되어 있으면
UIScrollViewDelegate 의 scrollViewDidScrollToTop 를 호출하기 때문에 동작하게 됩니다.

하지만, UIScrollView 가 여러개 있으면 이 동작이 무시됩니다.

즉, Status Bar 를 터치해도 스크롤이 올라가는 동작이 작동을 안하게 됩니다.


여기까지는 SDK 문서에 나온 내용이구요...
UIScrollView 를 여러개 사용하는 앱에서 이 동작을 사용하는 방법은 다음과 같습니다.


첫 번째 방법은 메인 윈도우에 스크롤뷰를 하나만 붙입니다.

다른 방법은 스크롤 뷰의 scrollsToTop 속성을 하나만 YES 로 하고 나머지는 다 NO 로 설정합니다.


첫 번째 방법은

예를들어 Custom Tab 컨트롤러를 만들어서 뷰를 전환하는 경우에 사용합니다.
아래 코드에서 형광펜으로 칠한 부분입니다.
기존 스크롤뷰를 없애고, 새로운 스크롤 뷰를 붙여서 스크롤 뷰를 하나만 유지합니다.
(oldViewController, newViewController 는 스크롤뷰로 뷰를 구성했습니다.)
[CODE]//  현재 탭 화면을 숨깁니다.
UIButton *oldTabButton = [tabButtons objectAtIndex:selectedTabIndex];
if (nil != oldTabButton) {
    oldTabButton.selected = NO;
   
    UIViewController *oldViewController = [tabControllers objectAtIndex:selectedTabIndex];
    [oldViewController.view removeFromSuperview];
}

// 새로운 탭 화면을 보이게 합니다.
selectedTabIndex = tabIndex;
UIButton *tabButton = [tabButtons objectAtIndex:selectedTabIndex];
tabButton.selected = YES;

UIViewController *newViewController = [tabControllers objectAtIndex:selectedTabIndex];
[contentView addSubview:newViewController.view];
[/CODE]

두 번째 방법은

한 화면에 두 개의 스크롤뷰가 있는 경우에 사용합니다.
아래 코드는 조금 특수한 경우인데, 한 화면에 스크롤뷰와 웹뷰가 같이 있는 경우입니다.
스크롤뷰가 여러 개 있을 경우에는 메인 스크롤뷰의 scrollsToTop 속성만 YES 로 만들어야 하기 때문에
웹뷰의 스크롤뷰는 scrollsToTop 속성을 NO 로 만들었습니다.
(웹뷰는 subview 가 스크롤뷰로 구성되어 있기 때문에 아래 코드처럼 스크롤뷰를 따로 찾아야 합니다.)
[CODE]// 웹뷰의 스크롤뷰를 찾습니다.
for (UIView *v in webView.subviews) {
    if ([v isKindOfClass:[UIScrollView class]]) {
        ((UIScrollView *)v).scrollsToTop = NO;
    }
}[/CODE]