2010-07-14 2 views
14

xib 파일에 정의 된 사용자 지정 셀에 UITableView가 있고 셀에 UISegmentedControl이있을 때 내 장치에서 성능이 좋지 않은 (끊김) 현상이 발생합니다. NSLog 문은 셀을 할당하고 재사용하고 있음을 나타냅니다. cellForRowAtIndexPath 메서드에 대한 내 코드는 아래와 같습니다. Apple 설명서에 따라 xib에 연결됩니다. (스크롤 원활 BTW 시뮬레이터)UISegmentedControl 개체가있는 사용자 지정 테이블 뷰 셀의 스크롤 성능이 저하되는 이유는 무엇입니까?

- (UITableViewCell *)tableView:(UITableView *)tableView 
       cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *MyIdentifier = @"MyIdentifier"; 

    UITableViewCell *cell = 
      [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 

    if (cell == nil) 
    { 
     [[NSBundle mainBundle] loadNibNamed:@"TableViewCell" 
           owner:self 
           options:nil]; 
     cell = self.tvCell; 
     self.tvCell = nil; 
    } 

    cell.layer.shouldRasterize = YES;  // build error is here 

    UILabel *lbl = (UILabel *)[cell viewWithTag:1]; 

    [lbl setText:[NSString stringWithFormat:@"Q%i", indexPath.row+1]]; 

    return cell; 
} 

답변

46

는 모든 테이블 셀이 성능 문제가 발생할 것입니다 스크롤되는 동안 수행하는 것을 그리기; 하위 뷰가 많이있을 때 드로잉이 많이 발생하는 경향이 있습니다. 관찰 한 것처럼 스크롤이 꽤 고르지 않게됩니다. 이를 줄이려면 몇 가지 방법이 있습니다.

첫 번째 단계는 셀 자체와 가능한 한 많은 하위 뷰에서 속성이 YES으로 설정되어 있는지 확인하는 것입니다. 불투명 뷰는 그 아래에있는 컨텐츠와 블렌드 할 필요가 없으므로 많은 시간을 절약 할 수 있습니다.

또한 다음과 같이 자신을 래스터 화하기 위해 세포의 층을 설정할 수 있습니다 :이 코어 애니메이션 단지에 좋아하는 물건의 종류 플랫 비트 맵으로보기 계층 구조를 축소합니다

cell.layer.shouldRasterize = YES; 
cell.layer.rasterizationScale = [UIScreen mainScreen].scale; 

무승부. 애니메이션보기 (예를 들어 활동 표시기)는 비트 맵이 변경 될 때마다 업데이트되도록합니다 (예 : 많은 경우). 이 경우 셀에서 모든 내용을 래스터 화하지 않아도됩니다. 동적 인 콘텐츠가있는 다른 하위보기 아래에 상대적으로 정적 인 모든보기 (예 : 라벨)가 포함 된 하위보기를 사용하고 그 중 첫 번째보기 만 래스터화할 수 있습니다.

+0

노아, 추천 한 코드 줄을 추가 한 다음 레이어를 참조 할 수 있도록 QuartzCore 프레임 워크를 추가하면 빌드 오류가 발생합니다. "구조체 또는 공용체가 아닌 멤버에서 'shouldRasterize'멤버를 요청하십시오." . 이 두 줄의 코드를 작동시키는 데 필요한 것이 무엇인지 더 자세히 말씀해 주시겠습니까? – Alyoshak

+3

.m에 #import 가 없으면이 오류가 발생할 수 있습니다. 또한, shouldRasterize는 iOS 3.2 이상에서만 사용할 수 있습니다. –

+0

예는 내 .m 파일에서 가져오고 도 가져옵니다. 그러나, 아니, 3.2 (3.1.3 사용)를 사용하지 마십시오. 문제 여야합니다. 그래, iOS 3.2를 사용하여이 기기 (iPodTouch)를 타겟팅하는 데 성공하지 못했습니다. 코드 서명 오류 및 iOS 3.2와 관련된 또 다른 이상한 코드입니다. 둘 다 있습니다 : [BEROR] CodeSign 오류 : SDK 'Device - iPhone OS 3.2'의 'Application'제품 유형에 코드 서명이 필요합니다. [BWARN] 경고 : '대상 장치 제품군'이 iPhone 전용으로 설정된 건물 ('1 ')는 SDK'Device - iPhone OS 3.2 '에서 지원되지 않습니다. – Alyoshak

3

xib에서 식별자가 'MyIdentifier'인지 확인하십시오. 그렇지 않은 경우 좋은 실적을 올릴 수 있습니다. 나는 '할당 및 재사용'이 시작될 때 할당 된 몇 개가 더 이상 할당되지 않는다는 것을 의미하는 것으로 짐작하고 있습니다. 그게 사실이라면 당신은 아마 모두 설정되어있을 것입니다.

성능을 향상시키는 또 다른 방법은 코드로 테이블보기를 구성하는 것입니다. xib를 사용하는 것보다 빠르게 처리 할 수 ​​있습니다. 테이블 뷰를 만들 때 보통 IB로 빌드 한 다음 프레임 값을 코드로 복사하고 코드로 구성합니다.

WWDC 2010 성능 비디오를 시청할 시간을 마련하십시오. 훌륭한 정보가 많기 때문에 나는 그들을 볼 때마다 새로운 것을 배웁니다.

관련 문제