2012-01-02 2 views
4

내 텍스트가 흰색 테두리로 둘러싸여지기를 바랍니다. 텍스트에 CATextLayer를 사용하고 있습니다. CATextLayer에 borderColor/borderWidth 속성이 없다는 것을 알고 있습니다. 물론 수퍼 클래스 (CALayer)의 속성을 사용할 수 있지만 텍스트 자체가 아닌 레이어 프레임 주위에 테두리를 그립니다. 아무도 내가 CATextLayer를 사용하여 이것을 달성 할 수있는 방법을 알고 있습니까? 누군가가 내 솔루션에 관심이 그냥 경우CATextLayer 글꼴 borderColor?

enter image description here

+0

뭔가 나에게 말하고는이 작업을 수행 할 수있는 유일한 방법은 대리자 메서드를'하나를 사용하고 서브 클래스'CATextLayer'하거나 것을 drawLayer : inContext :'실제 드로잉을 직접해라. –

+0

댓글을 주셔서 감사합니다. 구현하기가 어렵다고 들립니다. 나는 드로잉을 직접하길 원합니다 ... – strave

+0

[저급 텍스트 렌더링] (http://www.codeproject.com/KB/iPhone/Glyph.aspx)에서이 페이지를 확인하십시오. 처음에는 상당히 컸지 만 시간을 들여 처리하면 무슨 일이 일어나는지 요령을 알 수 있습니다. – pe8ter

답변

5

:

기본적으로 직접 CoreText를 사용하지 않고 스트로크 (국경) 텍스트를 만드는 것이 가능하다. CATextLayer의 string 속성은 NSAttributedString을 허용합니다. 따라서 NSAttributedString에 스트로크 색상 및 스트로크 너비가있는 속성을 지정하는 것만 큼 쉽습니다.

불행히도 나는 글꼴 크기를 애니메이션화해야했습니다. 문자열 속성은 애니메이션 가능하지만 NSString 인 경우에만 가능합니다. 그래서 나는 CATextLayer를 서브 클래스 화하기로 결정했다. 많은 노력 끝에 CATextLayer의 문자열과 내용 속성이 상호 배타적이라는 것을 알게되었습니다. 즉, 문자열이나 내용이 표시됩니다. 나는 그 자신을 그리는 방법을 알아낼 수 없었다. display 및 drawInContext : ctx 메서드는 내용이 업데이트 될 때만 호출되지만 문자열 업데이트를 위해 호출해야하는 내용을 알지 못했습니다.

그래서 CALayer를 서브 클래 싱하는 자체 CATextLayer 클래스를 작성하기로 결정했습니다. fontSize라는 애니메이션 가능한 속성을 만들었습니다. 이 객체가 애니메이션되면 drawInContext : ctx 메서드가 호출됩니다. drawInContext : ctx 메서드에서 CoreText를 사용하여 새 문자열을 만들고 fontSize 속성을 사용하여 크기를 적절히 업데이트합니다. 글꼴 크기 애니메이션에 대해 걱정할 필요없이 솔루션에 관심있는 사람들을위한

3

:

@import QuartzCore; 
@import CoreText; 

- (void)addTextLayer 
{ 
    NSDictionary* attributes = @{ NSFontAttributeName : [UIFont boldSystemFontOfSize:40.0], 
           (NSString*)kCTForegroundColorAttributeName: (id)[UIColor blackColor].CGColor, 
           (NSString*)kCTStrokeWidthAttributeName: @(-2.0), 
           (NSString*)kCTStrokeColorAttributeName: (id)[UIColor whiteColor].CGColor }; 
    CATextLayer* textLayer = [CATextLayer layer]; 
    textLayer.string = [[NSAttributedString alloc] initWithString:@"Hello World" attributes:attributes]; 

    // Do the rest... 
} 
관련 문제