2010-12-08 4 views
22

iOS 제공 NSString (UIStringDrawing) 카테고리 메소드를 사용하여 그린 텍스트에 그림자를 추가하고 싶습니다.UILabel을 사용하지 않고 drawRect : 메서드에서 NSString 텍스트에 그림자를 추가하는 방법

- (CGSize)drawAtPoint:(CGPoint)point forWidth:(CGFloat)width 
      withFont:(UIFont *)font minFontSize:(CGFloat)minFontSize 
     actualFontSize:(CGFloat *)actualFontSize 
     lineBreakMode:(UILineBreakMode)lineBreakMode 
    baselineAdjustment:(UIBaselineAdjustment)baselineAdjustment; 

분명히 그림자 옵션이 없습니다.

예, 여기서 UILabel을 사용할 수 있고 설정할 그림자 속성을 가져올 수 있습니다. 그러나 UIView 하위 클래스 (예 : UILabel)가 CALayer 객체를 래핑하고 더 무거워 질 수 있기 때문에 성능이 떨어집니다 슬기로운).

다음은 컨텍스트입니다.

합성 된 UIView 하위 클래스의 Nib 파일에서 테이블 셀을 만드는 대신 테이블 셀 뷰에서 drawRect:을 구현하여 UITableViewCell 하위 클래스에 대한 사용자 지정 그리기를 수행하고 있습니다.

한 무리의 UIView 하위 클래스를 합성하면 테이블 뷰 스크롤링 성능에서이 범위를 유지하고 초당 50-60 프레임 내에 머물러있게하려는 목적을 무효화 할 수 있습니다.

약간의 오프셋을 두 번 문자열을 그리기 시도했다. 일단 내가가는 셀의 배경색에 드롭 섀도우 컬러를 조정하면 이것이 허용 될 수 있지만 오히려 복잡해 보입니다. 물론 UILabel을 사용하면 드롭 그림자 흐림 효과가 없습니다.

솔루션을 검색해 보았고 UILabel 사용법을 권장합니다 (테이블 셀 뷰에 합성 된 약 12 ​​개의 텍스트 요소가 있기 때문에 위의 내용을 무시했습니다) 또는 CGContextSetShadow(). 후자는 항상 직사각형 모양의 컨텍스트에서 제안 된 것으로 보이며 위에서 언급 한 NSString drawAtPoint... 메서드로 직접 그려진 텍스트 경로에 그림자를 부착 할 필요는 없습니다. (시도했지만, 작동하지 않는 것 (즉, 변경되지 않음), Core Graphics 드로잉을 처음 사용함).

제안 사항?

답변

40

그것은 나를 위해 CGContextSetShadow()와 함께 잘 작동합니다. 예 :

- (void)drawRect:(CGRect)rect 
{ 
    NSString *string = @"Hello World!"; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetShadow(context, CGSizeMake(20.0f, 20.0f), 10.0f); 

    [string drawAtPoint:CGPointMake(100.0f, 100.0f) withFont:[UIFont boldSystemFontOfSize:36.0f]]; 
} 
+3

우수. 감사합니다 올레! 이전에 나는 블러 값이 너무 높았고 단지 (1,1)의 오프셋을 가지고 있기 때문에 효과가 나타나지 않는다고 생각합니다. 필자가 처음 겪었던 다음 과제는 후속 드로잉의 그림자 효과를 끄는 것이 었습니다 (실제로 Quartz 2D 가이드를 체계적으로 읽어야합니다). 그러나 그림자 효과를 설정하기 전에 "CGContextSaveGState (context)"를 사용하고 NSString이 드로잉을 마친 후 "CGContextRestoreGState (context)"를 사용하여 성공했습니다. 나는 모든 준비가되어있다! – idStar