iPhone UITableView 스크롤 성능 향상을위한 트릭?


89

각 셀에 상당히 큰 이미지를로드하는 uitableview가 있으며 셀 높이는 이미지의 크기에 따라 다릅니다. 스크롤 성능은 괜찮지 만 때때로 불안정 할 수 있습니다.

FieryRobot 블로그에서 찾은 다음 팁을 찾았습니다.

uitableview로 유리 스크롤

uitableview로 더 유리한 스크롤링

누구든지 uitableview 스크롤 성능을 개선하기위한 팁이 있습니까?


계산하는 데 비용이 많이 들고 자주 사용되는 셀 높이를 캐시해야하는 경우 예제를 제공했습니다. 응용 분야에 적합한 경우에만 사용하십시오. stackoverflow.com/questions/1371223/...
폴 드 랭에게

답변:


156
  1. 행 높이 캐시 (테이블보기에서 자주 요청할 수 있음)
  2. 테이블에 사용 된 이미지에 대해 가장 최근에 사용되지 않은 캐시를 생성하고 메모리 경고를 받으면 모든 비활성 항목을 무효화합니다.
  3. 모든 것을 그리기 UITableViewCelldrawRect:경우 모든 비용으로 가능한 피하기 파단 (또는 표준 접근성 기능이 필요한 경우, 컨텐츠보기의drawRect: )
  4. UITableViewCell의 레이어를 불투명하게 만듭니다 (컨텐츠 뷰가있는 경우에도 동일 함).
  5. UITableView예제 / 문서에서 권장하는 reusableCellIdentifier 기능을 사용하십시오.
  6. UIImages 로 미리 베이킹되지 않은 그라디언트 / 복잡한 그래픽 효과를 피하십시오.

5
또한 다운로드 한 이미지는 셀에 표시하기 전에 imageView의 크기로 축소해야합니다!
Zoltán Matók 2014

4
이 답변에 지난 몇 년 동안의 경험을 추가하고 싶습니다. 투명한 셀이 있다는 것은 아마도 스크롤 성능이 나쁜 원인이 아닙니다. 매우 복잡한 셀 (20 개 이상의 하위보기)이있는 앱이 있으며 배경을 표시하는 것이 모두 투명합니다. 적절한 최적화를 통해 투명성은 3GS에서도 차이가 없습니다. 실제로 작업 속도를 가장 느리게 한 것은 테이블 뷰에서 대기열을 빼기에 충분한 셀이 있기 전에 nib loading이었습니다. 하위보기를 사용하는 경우 효율적인 계층 구조가 있는지 확인하고 drawRect를 사용할 필요가 없습니다.
Accatyyc 2014

@Accatyyc, 같은 문제가있는 것 같습니다. 대기열에서 빼기에 충분한 셀이 없으면 약간의 지연이 있고, 3-4 개의 셀이 대기열에서 빼면 스크롤이 부드럽습니다. 스크롤 할 때 대기열에서 빼고 NIB 파일을로드하지 않도록 셀을 미리로드하는 방법이 있습니까?
Tiois

@Tiois 물론입니다. 셀을 대기열에서 빼는 이전 방법을 사용해야합니다 (클래스 / 닙을 등록하지 말고 dequeueCellWithIdentifier :가 nil을 반환하는 경우 생성). 이렇게하면 테이블보기가 존재하기 전에 셀 집합을 만들 수 있습니다 (예 : 이전에 20 개 만들기). 그런 다음 cellForRowAtIndexPath :에서 새 항목을 만드는 대신 먼저 자신의 캐시에서 비어있을 때까지 가져옵니다.
Accatyyc

UICollectionView를 사용하고 있으며 동일한 문제에 직면하고 있습니다. 내 사용자 지정 셀 펜촉 파일에서. 수직 UIstackView 내부에서 UIwebView 및 UIImageView를 포함한 여러 하위보기를 사용하고 있습니다. 목록을 스크롤 할 때 재사용 된 셀의 크기를 재조정하는 데 상당한 시간이 걸리고 스크롤이 매우 불안정 해 보입니다.
Mansuu .... 2017-10-03

40
  1. 하위 클래스 UITableViewCell를 만드는 경우 Nib을 사용하지 말고 대신 코드로 작성하십시오. Nib 파일을로드하는 것보다 훨씬 빠릅니다.
  2. 이미지를 사용하는 경우 이미지를 캐시하고 있는지 확인하여 각각에 대해 파일에서 한 번 이상로드 할 필요가 없습니다 (메모리가있는 경우 이미지가 차지하는 공간의 양에 놀랄 것입니다).
  3. 가능한 한 많은 요소를 불투명하게 만드십시오. 마찬가지로 투명한 이미지를 사용하지 말고 사용하십시오.

3
걱정하지 마세요 ... 트롤이었습니다. 좋은 대답!
Steav

79
반대표는 아마도 "촉수 방지"가 성능 향상을위한 나쁜 조언 때문일 것입니다. 셀을 재사용하는 경우 스크롤 할 때 셀이 펜촉에서 전혀 재구성되지 않습니다.
Steven Fisher

6
펜촉은 속도면에서 동일하거나 Cocoa with Love 연구를 기반으로 조금 더 빠릅니다. cocoawithlove.com/2010/03/…
MaxGabriel 2013-04-24

Nib을 사용하는 @Steven Fisher는 테이블이 셀을 할당하고 할당을 해제 할 때 (예 : 빠른 스크롤링) 느려질 수 있습니다.
Sound Blaster

3
NIB를 사용 하면 셀을 구성 할 때 속도가 느려질 있습니다 . 셀 재활용을 사용하는 경우 화면을 채우기 위해 할당 된 셀만 충분합니다. 최대 10 명 정도라고 말하세요. 스크롤 할 때 셀이 생성되지 않습니다. 그들은 단지 재사용 되고 할당 해제되거나 재 할당되지 않습니다. 그리고 물론 할당을 취소하는 데 비용이 들지 않습니다. 아니, 이것은 올바르지 않습니다.
Steven Fisher

34

Tweetie의 개발자는 이에 대해 광범위하게 작성했으며 해당 앱에서 어떻게 수행되었는지를 보여주는 코드가 있습니다. 기본적으로 그는 테이블 셀당 하나의 사용자 정의보기를 옹호하고 수동으로 그립니다 (다른 옵션 중에서 Interface Builder를 사용하여 하위보기하는 대신).

uitableview로 트윗에서 빠른 스크롤

또한 Apple은 TableViewSuite 자습서에서 TableView에 대한 자체 샘플 코드를 업데이트했습니다 (아마도 이에 대한 응답일까요?).

TableViewSuite


1
이것은 멋진 솔루션입니다. cellView에 UIButton을 추가하는 방법이 궁금합니다. drawRect 메서드에서 그려지고 있습니까?
Sukitha Udugamasooriya

1
@beno, 귀하의 링크가 깨진 것 같습니다 (첫 번째 링크) 원본 기사에 손을 댈 기회가 있습니까?
apouche

3
원래 문서는 여기 읽을 수 있습니다 : web.archive.org/web/20100922230053/http://blog.atebits.com/2008/...
jverdi

원래 버전과 웹 아카이브에 추가 링크가 존재하지 않습니다
랄프 Willgoss에게

1

UITableView 스크롤링의 # 1 성능 킬러는 모든 셀 뷰 레이어에 그림자를 그리는 것이므로 스크롤 성능이 중요하다면 기본적으로 기본 스레드 속도가 느려지지 않는 한 그림자를 사용하지 마십시오.

받아 들여진 답변 중 그림자와 레이어에 대한 언급이 없기 때문에 이것을 말해야한다고 생각했습니다. : +)


6
문제가 그림자라면이 두 줄의 코드를 추가하면 모두 완벽하게 작동합니다. self.layer.shouldRasterize = YES; self.layer.rasterizationScale = UIScreen.mainScreen.scale;
Pedro Romão 2015

0

UITableView스크롤 성능 문제 는 다른 답변에서 이미 설명한 기술을 사용하여 해결할 수 있습니다. 그러나 여러 번 느린 성능은 본질적으로 오류가 있거나 반복적 인 것으로 인해 발생합니다.

UITableView셀 을 재사용한다는 사실과 각 셀에 자체 이미지가 필요할 수 있다는 사실은 함께 솔루션 비트를 복잡하게 만듭니다. 일반적인 방법으로 해결되는 방법에서 처리해야 할 사항을 요약합니다.

  1. REST / 데이터베이스에서 데이터 소스로 데이터를로드합니다. 이 단계는 백그라운드에서 수행되어야하며 결국 GCD 대기열과 함께 dispatch_async를 사용합니다.
  2. 관련 데이터 모델 객체를 생성 및 초기화하고 배열에 넣습니다.
  3. [tableView reloaddata]
  4. 내부 cellForRowAtIndexPath 에 배열의 올바른 데이터 모델 개체에서 데이터 (텍스트)를 설정하는 코드를 포함합니다.
  5. 이제 이미지도 URL 형식 일 수 있으므로이 단계는 테이블보기에서 수행되는 셀 재사용으로 인해 약간 기발 할 수 있습니다. 사실의 핵심은 비동기 대기열을 사용하여 장치 캐시 / URL에서 이미지를 다시로드 한 다음 올바른 cell.image (셀 이미지 속성이 무엇이든)로 설정하는 것입니다.

문제를 방지하려면 테이블보기 내 에서 이미지의 지연로드에 대한이 자습서를 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.