2013-10-11 4 views
0

ipad 용으로 설계된 IOS 애플리케이션이 있습니다. 한 페이지에서 사용자에게 보고서를 표시하고 보고서에 UIScrollView 내부의 화면에 5000 개의 UILabel이 렌더링되어야합니다. 이로 인해 응용 프로그램이 메모리 부족으로 인해 중단됩니다. UITableView에는 필요에 따라 내용을로드하는 기능이 있습니다. 스크롤 뷰를 특정 콘텐츠에만 렌더링하도록하려면 어떻게해야합니까? 스크롤 할 때 보이지 않는 콘텐츠를 제거하고 표시되어야하는 콘텐츠를 추가 할 수 있습니까?스크롤로 UIScrollView 데이터를로드하는 방법

+1

당신이 요구 한 것은 정확히 UITableView 또는 UICollectionView 사용의 요점입니다. UIScrollView 대신에 이것을 사용해야하며, 원하는만큼의 데이터 요소를 처리 할 수 ​​있습니다. –

+0

UIScrollView를 사용해야한다는 요구 사항이 있습니다. 그렇지 않으면 나는이 질문을하지 않을 것이다. – neo

+0

UIScrollView를 사용해야하는 이유를 이해하는 것이 유용 할 것입니다. 콜렉션 뷰에 이미 빌드 된 것과 동일한 기능을 사용하기 위해 커스텀 로직을 많이 작성하게 될 것입니다. –

답변

0

사용자 정의 행 (여러 개의 레이블로 구성된 행)의 테이블보기를 사용하도록 재구성 할 수 있습니까? 이 모델은 매우 자연스러운 방식으로로드 온 디맨드 및 리소스 재사용을 지원합니다 ...

아마도 화면 레이아웃에 더 구체적 일 수 있습니까?

+0

아니요. UIScrollView를 사용하는 것이 필수입니다. – neo

0

테이블보기가 표 셀을 재활용하는 것처럼 레이블을 다시 순환 (즉, 재사용)해야합니다. 이것은 종종 "타일링"서브 뷰라고합니다. 타일링을 사용하면 메모리에 저장되는 것 이상을 표시 할 수 있습니다.

WWDC 2012 세션 104를 시청하는 것이 좋습니다.이 세션의 자습서는 UIScrollView에서 이미지보기를 바둑판 식으로 배열하는 사진 앱을 만듭니다. 사진 응용 프로그램은 항목 그리드가 아닌 콘텐츠 페이지를 스크롤하지만 비디오가 귀하의 응용 프로그램과 관련 될 수 있다고 생각합니다.

(1.) 레이블의 트랙을 유지 인스턴스 변수 선언 :

여기에 특정 경우에 적용 튜토리얼의 매우 간략한 개요입니다

NSMutableSet *recycledLabels; 
NSMutableSet *visibleLabels; 

(2) 방법을 구현을 그

- (UILabel *)dequeueRecycledLabel;

(3) 타일링을하는 방법을 구현 :

를 재사용 가능한 라벨을 가져옵니다
- (void)tileLabels; // this will add/remove labels from the scroll view 

(4.) 당신의 스크롤 뷰의 대리자를 설정하고 scrollViewDidScroll에 tileLabels 전화 : 위임 방법 WWDC 비디오는 당신은 내가 당신의 사건에 적용 할 수있는 생각 세부 사항을 기입 도움이 될 것입니다

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    [self tileLabels]; 
} 

. 그러나, 당신은 당신의 특정한 경우에 효과가 있도록 즉흥 연주를 많이해야 할 것입니다. 이것은 쉽지 않을 수 있습니다. 그러나 그것의 행실.

비디오의 끝 부분에서 CATileLayer로 타일링에 대해 설명합니다. 솔직히 말해서, 나는 그 부분을 이해하지 못했다. 그러나 큰 이미지를 표시하지 않기 때문에 귀하의 경우에는 해당되지 않는다고 생각합니다.

+0

비디오를 찾을 수 없습니다. URL을 제공 할 수 있습니까? – neo

0

마지막으로 동적 콘텐츠로드를 구현했습니다. 구현 한 방법은 입니다. scrollViewDidScroll입니다. 이 방법은 내부 그때 내가 따라 표시되는 콘텐츠 사각형을 결정한 다음

bool isUp = (currentOffset.y > lastScrollOffset); 

스크롤 방향을 결정 하였다.

CGRect visibleContentRect; 
visibleContentRect.origin = scrollView.contentOffset; 
visibleContentRect.size = scrollView.bounds.size; 

그럼 프레임 배열이 설정되어 있기 때문에 뷰 요소 배열이 있으며 각 요소가 스크롤 뷰에서 해당 위치를 알고있었습니다. 간단히 말해, 스크롤이 발생할 때마다 프레임이 보이는 내용 프레임에 의해 교차되거나 포함 된보기가 결정되었습니다.나는 그보기를 스크롤보기에 추가했다. 나는 또한 사라진 것들을 결정하고 스크롤보기에서 그들을 제거하고 나는 또한 그 견해를 없애고 그들을 재창조했다. [scrollView addSubview :보기] 메서드가 호출되면 뷰는 메모리에 더 많은 공간을 확보하기 때문에 표시됩니다. [view removeFromSuperView] 메서드는 해당 공간을 할당 해제하지 않습니다. 그래서 뷰를 nil로 설정하고 다시 생성해야합니다.

관련 문제