2012-07-10 2 views
0

이 질문을 설명하는 방법을 모르겠다는 이유로 무딘 제목으로 나를 용서하십시오.iOS UIView 스크롤링 UI - 구현 방법

최근 iOS 앱은 화면의 실제 크기를 최대화하는 데 도움이되는 스크롤 UI 디자인 패턴을 사용합니다. 일반적으로 사용자가 아래로 스크롤 할 때 헤더가 숨겨집니다.

예를 들어, Instragram의 기본보기에는 맨 위에 Instragram 헤더가 있습니다. 이보기에서 위쪽으로 스크롤하면 머리글이 맨 위에 고정되고보기가 정상적으로 내용의 맨 위로 되돌아옵니다. 그러나 아래로 스크롤하면 헤더가 내용의 일부로 작동하여 추가 44 포인트의 수직 공간을 만듭니다.

아마도 iOS를 많이 사용하지는 않았지만이 방법을 가장 잘 구현하는 방법을 쉽게 알 수 없습니까? 끔찍한 묘사에 사과드립니다.

+0

(테이블을 축소 상단에 약간의 공간을두고 만약 원한다면). 상단으로 다시 스크롤하면 테이블이 뒤로 축소됩니다. 올바르게 기억한다면 각 요소의 Y 좌표를 오프셋하여 일련의 setFrame을 [UIView 애니메이션] 내부에서 사용했습니다. 또한 scrollViewDelegate 메서드를 구현하고 scrollView의 contentOffset 값을 확인해야한다는 것을 기억합니다. – Zhang

답변

1

나는 위의 ranReloaded의 답변을 시도했지만 UIScrollView에서 setFrame:을 호출하면 경계를 벗어날 때보기가 멈추게됩니다.

대신에 scrollerWrapper이라는 다른 UIView에 맞게 스크롤보기를 설정합니다. 계산 된 원점과 높이를이 뷰에 적용하면 바운스 동작을 더한 후에 플러스했습니다. 우리는 당신이 테이블보기를 스크롤 할 때 상단에하지 않으면, 그것은 거의 전체 화면으로 테이블을 확장 우리의 응용 프로그램 중 하나에서 비슷한 일을했다

- (void)scrollViewDidScroll:(UIScrollView*) scrollView 
{ 
    CGPoint offset = scrollView.contentOffset; 

    CGRect headerFrame = header.frame; 
    CGRect wrapperFrame = scrollerWrapper.frame; 

    if(offset.y > 0){ 
     headerFrame.origin.y = -offset.y; 
     wrapperFrame.origin.y = MAX(0, headerFrame.size.height - offset.y); 
     } 
    else{ 
     headerFrame.origin.y = 0.0; 
     wrapperFrame.origin.y = headerFrame.size.height; 
     } 
    wrapperFrame.size.height = self.view.frame.size.height - wrapperFrame.origin.y; 

    [header setFrame:headerFrame]; 
    [scrollerWrapper setFrame:wrapperFrame]; 
} 
+0

헤더보기의 프레임 설정이 스크롤보기에 영향을 미치는 이유를 모르겠습니다. 머리글 및 스크롤은 독립적 인 형제입니다 (부모 - 자식이 아님) –

+0

왜 스크롤보기의 프레임을 수정해야합니까? 아마도 내가 성취하고자하는 것을 완전히 이해하지 못했을까요? –

1

헤더가 무엇이든 상관없이 그대로 유지되는 경우 스크롤보기 상단에서 별도의보기를 사용하십시오. UITableView를 사용하는 경우 섹션 헤더를 사용할 수 있습니다.

편집 사용이 코드 :.

- (void)scrollViewDidScroll:(UIScrollView*) scrollView 
{ 
    CGPoint offset = scrollView.contentOffset; 

    CGRect headerFrame = _headerView.frame; 

    if(offset.y > 0){ 
     headerFrame.origin.y = offset.y; 
    } 
    else{ 
     headerFrame.origin.y = 0.0; 
    } 

    [_headerView setFrame:headerFrame]; 
} 

이 (_headerView이 아닌 그 안에, 스크롤 뷰의 꼭대기에 앉아, 헤더 있다고 가정 또한, 스크롤 뷰와 헤더 모두의 상단에서 시작 그들의 부모보기, y == 0 또한, 보기 컨트롤러가 스크롤보기의 대리자로 설정되어야합니다.

방금 ​​메모리에서이 코드를 작성했습니다. 테스트하지는 않았지만 기껏해야 조정할 필요가 있습니다.

+0

그게 문제 야. 헤더는 위쪽 스크롤 방향으로 고정되지만 아래쪽 방향으로 이동할 수 있습니다. – Graham

+0

그런 경우 : 1) 하나의 섹션과 하나의 큰 셀 (매우 우아하지 않은)이있는 테이블보기를 사용하거나 2) UIScrollView 대리자 메서드에서 현재 스크롤 오프셋 가져 오기를 기반으로 별도의 헤더보기를 조정합니다 (더 많이 필요합니다. 작동하지만 더 낫다) –

+0

답변에 코드를 추가했습니다. 확인 해봐. –