2011-02-06 2 views
21

UITableView를 사용하는 경우 [[ UITableViewCell alloc] initWithStyle: reuseIdentifier:][uiTableViewInstance dequeueReusableCellWithIdentifier:] 메서드를 사용하여 셀을 재사용 할 수 있습니다. 주어진 순간에보기에 단지 몇 개의 셀만 있기 때문에 거대한 테이블을 검사하여 메모리를 유지하는 데 도움이됩니다.uitableviewcell과 같은 맞춤 요소를 재사용/재활용하는 방법은 무엇입니까?

많은 서브뷰가있는 UIScrollView을 만들고 싶습니다. 모든 하위 뷰를 삽입하면 피할 수있는 많은 시간과 메모리가 필요합니다. Apple API는 식별자를 사용하는 셀 뷰와 마찬가지로 맞춤 구성 요소 (UIView 또는 여기의 하위 클래스)를 재사용 할 수있는 방법을 제공합니까?

API가없는 경우 하나를 만들지 만 이에 대해서는 의심의 여지가 있습니다. 예를 들어, 모든 새 하위보기에 대해, 나는 previos보기 후에 프레임 위치를 설정합니다. 재활용하는 동안 각 하위 뷰의 프레임을 업데이트하려면 어떻게해야합니까? 재생되는 모든 하위 뷰의 내용을 삭제하고 다시로드해야합니까? 이 계산을 다른 스레드에서 수행하여 화면이 갑자기 움직이지 않도록해야합니까? 모두, 나는 모든 재사용 물건과 함께 UITableView와 같은 부드러운 스크롤 경험을 갖고 싶습니다. 여기

는 내가 지금까지 작성한 코드의 샘플입니다 :
일부 통찰력 : 방법에서에 하위 뷰를 추가

int numberOfPages = 0; 
int pageWidth = 100; 
int pageHeight = 100 

UIScrollView *myScrollView = //allocate and initialize a scrollview 
//set its size to 100 by 100 (width equal to pageWidth) 
//set paging enabled for myScrollView 

, 그 여러 번

- (void) appendSubViewToScrollView { 
    UIView *view = //allocate and initialize a view and dump data in it. 

    CGRect rect = view.frame; 
    rect.size.height = pageHeight; 
    rect.size.width = pageWidth; 
    rect.origin = CGPointMake(pageHeight * numberOfPages, 0); 
    view.frame = rect; 

    [myScrollView addSubview:view]; 

    numberOfPages++; 

    [scrollView setContentSize:CGSizeMake(pageHeight * numberOfPages, pageWidth)]; 

    [view release]; 
} 

편집라고 테이블 뷰와 그 셀이 어떻게 장면 뒤에서이를 달성하는지에 대한 정보가 유용 할 것입니다.

답변

19

예, 테이블 뷰와 마찬가지로 항상 각 하위 뷰 콘텐츠를 복원해야합니다. 하위 뷰 재사용의 장점은보기 저장을위한 메모리 절약과보기 할당을위한 시간 절약이지만 물론 콘텐츠 데이터 관리는 사용자가 결정합니다.

따라서 표준 재활용 방법을 사용하면 화면에서 동시에 볼 수있는보기 수 + 스크롤을 시작할 때 나타날 수있는 여분의 셀 수와 동일한 수의 셀을 사용해야합니다. 예를 들어 한 번에 5 개의 전체 화면을 표시하고 (스크롤보기가 안정적) 화면을 스크롤하는 동안 부분적으로 표시된 추가보기가 필요하므로 결국 5 + 1 = 6보기가 필요합니다. 이것은 이론적으로 2 개 이상의 뷰를 사용하는 것이 좋습니다. 그래서 두 개의 풀을 작성해야합니다. 하나는 "visibleViews"이고, 모든 뷰는 scrollview에 서브 뷰로 추가되고, 또 하나는 재사용 가능한 모든 뷰로 구성된 "availableViews"입니다. 그런 다음이 모든 뷰를 만들고 스크롤 뷰에 추가합니다 (예 : 스크롤 뷰의 위치에 따라 프레임을 조정해야합니다. 예, 내용을 다시 설정해야합니다). 마지막으로 델리게이트를 설정하여 스크롤 뷰 이동을 추적해야합니다. 이 추적의 목적은 가시적 인보기가 더 이상 보이지 않는 것을 계산 한 다음 가시적 인 풀에서이를 제거하고 사용 가능한 풀로 이동하는 것입니다. 대리인은 새로운 셀이 나타날 때를 이해해야하지만, 여전히 보이지는 않습니다. 그리고 나서 사용 가능한 풀에서 가져옵니다 (또는 풀이 비어있는 경우 alloc/init합니다). 그리고 보이는 풀과 하위 뷰 모두에 추가합니다. scrollview. 물론 성능을 향상 시키려면 스크롤 뷰에 더 많은 하위 뷰를 배치하여 셀이 화면에 나타나기 시작할 때 정확히 이동하지 않도록해야합니다. 그 이유는 스크롤 측면에서 몇 가지 추가 뷰를 사용하는 것이 좋습니다 전망.

iOS의 스크롤보기 사용에 대한 WWDC 2010의 훌륭한 비디오가 있습니다 (등록 된 개발자 인 경우 액세스 할 수 있음) :이 기술에 대해 설명합니다.

XCode 문서에있는 Apple의 PhotoScroller 예제 코드는 본질적으로 WWDC 비디오에 언급 된 것과이 기술을 설명합니다.

+0

답장을 보내 주셔서 감사합니다. 이 코드와 관련된 코드가 있습니까? 나는 약간의 참고 문헌을 사용할 수있다. 그리고 네, 저는 등록 된 개발자입니다. 이 경우 관련 동영상을 지적 해 주시겠습니까? ("응용 프로그램 프레임 워크"? 나머지는 여가 시간에 시청할 것입니다.) 샘플 코드도 다운로드하겠습니다. 흥미롭고 유용하게 보입니다. – Sailesh

+0

체크 표시 (위쪽/아래쪽 화살표 아래에 있음)와 함께이 답을 표시하십시오. – JoePasq

+1

불행히도이 기술을 설명하는 비디오가 무엇인지 기억이 나지 않지만 데모로 설명 된 것을 기억합니다. "Scroll Views가 포함 된 앱 디자인"이라는 동영상이 있지만 올바른 동영상인지 여부는 확실하지 않습니다. 어쨌든보기에는 가치가 있습니다. (몇 가지 훌륭한 기술이 설명되어 있습니다.) WWDC 비디오 홈 페이지는 http://developer.apple.com/videos/wwdc/2010/에서 개발자 계정으로 로그인 한 다음 iTunes를 열고 비디오를 다운로드하거나 볼 수 있습니다. 제가 언급 한 것은 104 ("Scroll Views로 앱 설계")입니다. – viggio24

관련 문제