2010-01-12 4 views
20

UITableViewCell 인스턴스의 contentView 하위 뷰로 UILabel 인스턴스를 추가하려고합니다.Blurry UITableViewCell contentView의 프로그래밍 하위 뷰로

셀을 선택하면 레이블의 배경을 제외하고 행이 파란색으로 강조 표시됩니다. 라벨 텍스트가 선명합니다.

레이블 및 콘텐츠보기 backgroundColor 속성을 [UIColor clearColor]으로 설정하면 레이블 텍스트가 흐리게됩니다.

라벨 텍스트를 선명하게 유지하면서 행 강조 표시를 허용하려면 라벨 배경색을 지우려면 어떻게해야합니까?

다른 곳에서 읽은 제안 중 하나는 round 라벨의 frame 값 이었지만 아무런 영향이 없었습니다. 여기에 코드

내 사용자 정의 UITableViewCell 서브 뷰의 -setNeedsLayout 방법의 조각이다 : 나는이 문제에 실행

UILabel *_objectTitleLabel = [[UILabel alloc] initWithFrame:CGRectNull]; 
_objectTitleLabel.text = [self.awsObject cleanedKey]; 
_objectTitleLabel.font = [UIAppDelegate defaultObjectLabelFont]; 
_objectTitleLabel.highlightedTextColor = [UIColor clearColor]; //[UIAppDelegate defaultLabelShadowTint]; 
_objectTitleLabel.backgroundColor = [UIColor clearColor]; //[UIAppDelegate defaultWidgetBackgroundTint]; 
_objectTitleLabel.frame = CGRectMake(
     kCellImageViewWidth + 2.0 * self.indentationWidth, 
     0.5 * (self.tableView.rowHeight - 1.5 * kCellLabelHeight) + kCellTitleYPositionNudge, 
     contentViewWidth, 
     kCellLabelHeight 
); 
_objectTitleLabel.frame = CGRectIntegral(_objectTitleLabel.frame); 
_objectTitleLabel.tag = kObjectTableViewCellTitleSubviewType; 
//NSLog(@"_objectTitleLabel: %@", NSStringFromCGRect(_objectTitleLabel.frame)); 
[self.contentView addSubview:_objectTitleLabel]; 
[_objectTitleLabel release], _objectTitleLabel = nil; 

... 

self.contentView.backgroundColor = [UIAppDelegate defaultWidgetBackgroundTint]; 
self.contentView.clearsContextBeforeDrawing = YES; 
self.contentView.autoresizesSubviews = YES; 
self.contentView.clipsToBounds = YES; 
self.contentView.contentMode = UIViewContentModeRedraw; 
+0

소스 코드를 게시 할 수 있습니까? –

+0

추가 코드 스 니펫을 참조하십시오. –

답변

35

문제는 서브 픽셀 렌더링으로, 원점 (부동 소수점 값)에 0이 아닌 분수 구성 요소가있을 때 발생합니다. 가장 가까운 정수로 반올림하면 괜찮을 것입니다.

+0

프레임을 정수 값으로 설정하고 있습니다 :'_objectTitleLabel.frame = CGRectIntegral (_objectTitleLabel.frame)' –

+1

그리고 당신은 여전히 흐릿한 렌더링 문제가 있습니까? 부모님의 시각은 어떨까요? –

+4

경고 :이 문제는 또한 홀수 너비 및/또는 높이로보기의 '가운데'를 설정할 때 발생합니다. – mvds

2

자신 오늘, 어딘가에 읽고 그 기원이 아닌 정수 값과 UILabel 프레임의 크기는이 문제를 일으킬 수 있습니다 (나는 그들이 플로트임을 알고 있지만, 내 말 뜻을 알고 있습니다). 거기는 더 우아한 해결책이 될 수있어,하지만 빠른 해킹 나를 위해 문제를 해결 한 것으로 나타납니다있다 : 당신이 더 나은 해결책을 찾을 경우

self.valueLabel.frame = CGRectMake((int) frame.origin.x, (int) frame.origin.y, (int) frame.size.width, (int) frame.size.height); 

, 나는이 해킹을 대체 할 싶지만, 알려 주시기 바랍니다 뭔가 좀 더 세련되게.

+0

프레임을 정수 값으로 설정 중입니다 :'_objectTitleLabel.frame = CGRectIntegral (_objectTitleLabel.frame) ' –

1

때로는 언급 한 흐릿함의 이유는 레이블의 프레임이 셀 프레임을 벗어나는 것일 수 있습니다. 셀의 레이블 안에 넣은 텍스트가 모두 표시 되더라도 실제 레이블 크기는 셀 프레임보다 클 수 있습니다.

이것이 효과의 원인인지 확인하려면 인스턴스화 된 후 라벨 크기/위치에 대한 모든 데이터를 확인/인쇄하고 위임 방법 tableView : heightForRowAtIndexPath를 확인하는 것이 좋습니다. 셀에 대해 반환 할 셀 높이에 맞 춥니 다. 희망이 있으면 도움이 될 것입니다.

7

문제가 발견되었습니다. 상위 뷰의 좌표가 반올림되는지 확인하십시오.

1

round(); C 함수는 이유 때문에 제공됩니다.

#define roundCGRectValues (frame) \ 
frame = CGRectMake(round(frame.origin.x),round(frame.origin.y),round(frame.size.width),round(frame.size.height)); 

모두 필요합니다.

+2

앞서 언급했듯이,'_objectTitleLabel.frame = CGRectIntegral (_objectTitleLabel.frame);을 추가하면 효과가 없습니다. –

1

대기열에서 제외 된 재사용 가능한 셀에도 -setNeedsLayout이 호출됩니까? 그렇다면 셀에는 이미 내용보기에 레이블이 추가되어 있으므로 레이블을 두 번 그리면 흐리게 표시됩니다.당신이 당신의 하위 뷰를 추가하기 전에 비효율적 콘텐츠 뷰의 파단을 모두 제거하여이 문제를 해결 할 수 있습니다

for (UIView *subview in [[self contentView] subviews]) { 
    [subview removeFromSuperview]; 
} 

더 나은 솔루션을 사용하면 재사용 셀 된 직후의 내용을 수정할 수 있도록 휴대 서브 클래스에 속성을 제공하는 것 뷰 계층 구조를 처음부터 다시 작성하기보다는 필요합니다.

2

왜곡되거나 흐린 텍스트의 또 다른 원인은 셀 재사용입니다. 재사용 가능한 셀을 대기열에서 제거하는 경우 다른 치수로 다른 곳에서 다시 그릴 수 있으며 잘못된 텍스트로 셀에 도달하면 다시 사용할 수 있습니다.

셀이 고유한지 확인하려면 텍스트가 왜곡 된 표시를 위해 새 셀을 할당하고 다른 재사용 식별자로 해당 UITableViewCell 인스턴스를 표시해야합니다. 이것은 매우 소수의 세포를 다루고 있고 어떤 세포가 문제를 일으키는 지 정확히 아는 경우에만 실용적입니다.

8

내 경우에는 UILabel이 포함 된보기의 CGLayer에 shouldRasterize = YES을 설정하면 문제가 발생했습니다. 이 줄을 제거하면 텍스트가 선명하고 선명 해졌습니다.

+0

수정하십시오. 그러나 만약 당신이'UITableViewCell'을 사용하고 있다면, 이것은 스크롤에 jerkiness를 가져올 수 있습니다. 이 경우 래스터 화 스케일을 설정하십시오. –

+0

좋은 조언입니다. 내 테이블 뷰 셀에서 Quartz로 완벽한 사용자 정의 드로잉을 끝내고 이제는 번개처럼 빠르게 진행됩니다! –

+0

이것은 나를 위해 일했습니다 !!! 정말 고맙습니다!! – reidisaki

2

에서 YES으로 설정하면 흐려질 수 있습니다. 래스터 화 스케일을 설정하면 흐림이 제거됩니다. [self.layer setRasterizationScale:[[UIScreen mainScreen] scale]];

관련 문제