2009-11-12 6 views
2

불행히도 Lucida Grande에는 이탤릭체가 없으므로 필요합니다.Lucida Grande 기울임 꼴을 내 응용 프로그램에 어떻게 가져 옵니까?

내 옵션은 제한적으로 보였고 누군가 나를 위해 더 나은 옵션을 원합니다.

첫째, 나는 다음을 수행하여 NSAffineTransform을 적용하는 시도 :

NSFont *theFont = [NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSMiniControlSize]]; 

const CGFloat kRotationForItalicText = -15.0; 

NSAffineTransform *italicTransform = [NSAffineTransform transform]; 

[italicTransform scaleBy:[NSFont systemFontSizeForControlSize:NSMiniControlSize]]; 
[italicTransform rotateByDegrees:kRotationForItalicText]; 

theFont = [NSFont fontWithDescriptor:[theFont fontDescriptor] textTransform:italicTransform]; 

을하지만, 이것은 특히 읽을 수있는 텍스트를 생성하지 않습니다.

theFont = [NSFont userFontOfSize:[NSFont labelFontSize]]; 
theFont = [sharedFontManager convertFont:theFont toHaveTrait:NSItalicFontMask]; 

와 이탤릭체 때 여기에 텍스트를 읽을 수있는 동안은 분명히 다르기 때문에, 차라리 같은 폰트를 사용하는 것입니다 :

나의 다음 옵션은 다른 글꼴로 전환하는 것입니다.

필자는 이탤릭체와 이탤릭체 텍스트 모두에 userFontOfSize 글꼴을 사용할 수 있지만 현재 systemFontOfSize 글꼴을 사용하도록 제한되어 있습니다.

다른 좋은 옵션이 있습니까?

감사합니다.

+0

TPTB를 다른 방법으로 설득 할 수 없다면 불행히도 "필요"합니다. 좋은 선택의 부족은 그것을 할 것입니다. 내가 생각해 낸 옵션 중이 시점에서 완전히 받아 들일 수있는 옵션은 없습니다. – ericg

+1

이것은 내 애완 동물이지만, 당신이 만드는 것은 이탤릭 글꼴이 아니라 기울어 진 글꼴 (a.k.a. oblique)입니다. 특히 타이포 그래퍼에게는 엄청난 차이가 있습니다. – dreamlax

답변

6

이 답변은 처음의 답변과 비슷하지만 더 많은 테스트를 마친 후에 업데이트됩니다.

먼저, 이탤릭체 글꼴을 만드는 제 방법에는 큰 결함이있었습니다. 단순히 텍스트에 회전을 적용하는 대신 스큐 변환을 적용해야했습니다. WebKit's Font code에 적용 할 좋은 왜곡 변형을 찾았습니다. 여기에는 왜곡 변형이 포함되어 있습니다.

CGAffineTransformMake(1, 0, -tanf(SYNTHETIC_OBLIQUE_ANGLE * acosf(0)/90), 1, 0, 0) 

잘 보입니다.

단순히 다른 글꼴을 사용하는 것이 정답이 아닙니다. Lucida Sans 글꼴은 Lucida Grande (systemFontOfSize에 의해 반환 됨)와 사실상 동일하지만 실제 기울임 꼴 variant를 가지고 있지만 기울임 꼴은 일본어 문자를 기울임 꼴로 그릴 수 없습니다.

유일한 답은 systemFontOfSize를 얻고 이탤릭체 변형이 있는지 확인하고 그렇지 않으면 기울임 변환을 추가하는 것입니다.

NSFont    *theFont   = [NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSMiniControlSize]]; 
NSFontManager  *sharedFontManager = [NSFontManager sharedFontManager]; 

if (wantItalic) 
{ 
    theFont = [sharedFontManager convertFont:theFont toHaveTrait:NSItalicFontMask]; 

    NSFontTraitMask fontTraits = [sharedFontManager traitsOfFont:theFont]; 

    if (!((fontTraits & NSItalicFontMask) == NSItalicFontMask)) 
    { 
     const CGFloat kRotationForItalicText = -14.0; 

     NSAffineTransform *fontTransform = [NSAffineTransform transform];   

     [fontTransform scaleBy:[NSFont systemFontSizeForControlSize:NSMiniControlSize]]; 

     NSAffineTransformStruct italicTransformData; 

     italicTransformData.m11 = 1; 
     italicTransformData.m12 = 0; 
     italicTransformData.m21 = -tanf(kRotationForItalicText * acosf(0)/90); 
     italicTransformData.m22 = 1; 
     italicTransformData.tX = 0; 
     italicTransformData.tY = 0; 

     NSAffineTransform *italicTransform = [NSAffineTransform transform]; 

     [italicTransform setTransformStruct:italicTransformData]; 

     [fontTransform appendTransform:italicTransform]; 

     theFont = [NSFont fontWithDescriptor:[theFont fontDescriptor] textTransform:fontTransform]; 
    } 
} 
3

먼저, 기울임 꼴 글꼴을 만드는 제 방법에는 큰 결함이있었습니다. 단순히 텍스트에 회전을 적용하는 대신 스큐 변환을 적용해야했습니다. WebKit's Font code에 적용 할 좋은 왜곡 변형을 찾았습니다. 여기에는 왜곡 변형이 포함되어 있습니다.

CGAffineTransformMake(1, 0, -tanf(SYNTHETIC_OBLIQUE_ANGLE * acosf(0)/90), 1, 0, 0) 

잘 보입니다. 이를 설정하는 코코아 코드는 다음과 같습니다

const CGFloat kRotationForItalicText = -14.0; 

NSAffineTransform *fontTransform = [NSAffineTransform transform];   

[fontTransform scaleBy:[NSFont systemFontSizeForControlSize:NSMiniControlSize]]; 

NSAffineTransformStruct italicTransformData; 

italicTransformData.m11 = 1; 
italicTransformData.m12 = 0; 
italicTransformData.m21 = -tanf(kRotationForItalicText * acosf(0)/90); 
italicTransformData.m22 = 1; 
italicTransformData.tX = 0; 
italicTransformData.tY = 0; 

NSAffineTransform *italicTransform = [NSAffineTransform transform]; 

[italicTransform setTransformStruct:italicTransformData]; 

는 그러나, 나는이 "Lucida 나타"글꼴 루시다 그랜드 거의 동일하다 진짜 이탤릭체 변형을 가지고 다른 사람에 의해 들었다.

기본적으로 저는 다른 글꼴을 사용하지만 전체 승인을 받아야합니다. 그러나 Lucida Sans 글꼴을 찾을 수없는 이유로 인해 systemFontOfSize로 다시 설정하고 필요한 경우 위의 변환을 적용합니다.

0

당신은 바위 :

여기 내 최종 솔루션입니다! 저는 -14.0 회전 대신에 하나의 mod -16.0을 만들었습니다. 그래서 사용자는 거대한 스프레드 시트에서 이탤릭체로 된 값을보다 쉽게 ​​찾을 수 있습니다. 제 문제는 LucidaGrande가 아닌 글꼴을 사용하면 UI 전체에서 모든 종류의 세로 정렬 문제가 발생한다는 것입니다.