2013-02-10 7 views
8

the documentation에 따르면, CATextLayer 내부 글꼴 다듬기를 가능하게 할 수 있습니다 :CATextLayer에서 텍스트를 부드럽게하는 방법은 무엇입니까?

@implementation CATextLayerWithFontSmoothing 
-(id)init { 
    self=[super init]; 
    if (self) { 
    CALayer * whiteBackground = [CALayer layer]; 
    CATextLayer * blackText = [CATextLayer layer]; 

    [whiteBackground setBounds:NSMakeRect(0, 0, 300, 300)]; 
    [blackText setBounds:NSMakeRect(0, 0, 300, 300)]; 

    [whiteBackground setBackgroundColor:[NSColor whiteColor].CGColor]; 
    [blackText setForegroundColor:[NSColor blackColor].CGColor]; 
    [blackText setString:@"CATextLayer"]; 

    [blackText setShouldRasterize:YES]; 

    [self addSublayer:whiteBackground]; 
    [self addSublayer: blackText]; 

    } 
    return self; 

작동하지 않습니다

여기

Text can only be drawn using sub-pixel antialiasing when it is composited into an existing opaque background at the same time that it's rasterized.

내가이 문장을 이해하는 방법이다. 텍스트는 서브 픽셀 앤티 앨리어싱을 사용하여 그려지지 않습니다.

+0

작업 솔루션을 찾았나요? '[blackText setBackgroundColor : [NSColor whiteColor].CGColor]' –

+0

@robmayoff 배경 색상을 whiteColor로 설정하는 것을 잊어 버렸지 만 작동하지 않습니다. 즉, 서브 픽셀이 아닌 것입니다. – alecail

+0

나는이 순간에 나 자신을 통해 일하고있다. 위의 코드에서 적어도 하나의 문제는 blackText 레이어가 자체적으로 래스터 화하도록하는 것이고 이는 도움이되지 않습니다. 렌더링 할 때 하위 레이어를 래스터 화하도록 슈퍼 레이어에 지시해야합니다 ('setShouldRasterize :'를 설정하면됩니다.)이 문서의 일부를 읽으면 슈퍼 레이어에서 하위 레이어를 -CATextLayer는 안티 앨리어싱을 사용하여 슈퍼 레이어로 래스터 화됩니다. 다른 접근법을 찾지 못하면 나중에 테스트 할 것입니다. – Benjohn

답변

8

이 방법은 here 작품 설명

text on a regular CATextLayer

,617 : 여기

비 평활화 대 평활화를 비교

text with sub-pixel-aa

800% zoom of both layers

추신 : 브라운관에이 대답 보지 마십시오.

2

이 설명서를 이해하는 방식으로 CATextLayer항상은 하위 픽셀 안티 앨리어싱을 비활성화합니다. 당신이 인용 된 문장은 그냥 사용하도록 설정하는 방법에 대한 지침으로 이에 대한 설명으로 주어집니다 - 그것은 다음과 같습니다 렌더링 모드를 변경하지 않습니다 YES에 레이어의 불투명도 속성을 설정

.

... 이는 레이어에 불투명 한 배경을 사용하더라도 CATextLayer이 sub-pixel-aa를 사용하지 않는다는 사실을 변경하지 않음을 의미합니다.

사례 2 : 당신이 직접 CATextLayer를 사용하는 경우, 당신은 당신의 그리기 코드에서 다음 서브 클래스 CATextLayer 필요 등의 일을 할 수 있습니다 :

- (void)drawInContext:(CGContextRef)ctx 
{ 
CGContextSetRGBFillColor (ctx, r, g, b, a); 
CGContextFillRect (ctx, [self bounds]); 
CGContextSetShouldSmoothFonts (ctx, true); 
[super drawInContext:ctx]; 
} 
1

를 두드리는 경우 :하지만이 질문은 스티브의 답변으로 완벽한 솔루션을 가지고 있으며, nacho4d의 코멘트를 볼

text_layer.contentsScale = self.window!.backingScaleFactor 
text_layer.zPosition = 0 

(나는 또한 동일한 것으로보기 배경 레이어 contentsScale 설정) : 나는 수행하여 날카로운 일반 텍스트를 얻었다.

0

수락 대답은 내 기능에 해당되지 않습니다.

난 당신이 텍스트 레이어의 배경색을 설정 봤어 Ignacio Nieto blog

textLayer.contentsScale = UIScreen.mainScreen().scale