문제

불행히도, 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 글꼴을 사용하는 것으로 제한됩니다.

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

고맙습니다.

도움이 되었습니까?

해결책

이 답변은 나의 초기 답변과 유사하지만 더 많은 테스트 후에는 무엇이 작동하는지에 대해 업데이트되었습니다.

먼저, 이탤릭체 글꼴을 만드는 내 방법은 깊은 결함이있었습니다. 단순히 텍스트에 회전을 적용하는 대신 Skew 변환을 적용해야했습니다. 나는 신청할 좋은 왜곡 변환을 찾게되었다. WebKit의 글꼴 코드. Skew 변환이 포함되어 있습니다.

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

좋아 보인다.

단순히 다른 글꼴을 사용하는 것은 정답이 아닙니다. Lucida Sans Font는 Lucida Grande (SystemFontofSize에 의해 반환 됨)와 거의 동일하지만 실제 이탤릭체 변형이 있지만 이탤릭체 변형은 일본어 문자를 이탤릭체로 그리지 않습니다.

따라서 유일한 대답으로 보이는 것은 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];
    }
}

다른 팁

먼저, 이탤릭체 글꼴을 만드는 내 방법은 깊은 결함이있었습니다. 단순히 텍스트에 회전을 적용하는 대신 Skew 변환을 적용해야했습니다. 나는 신청할 좋은 왜곡 변환을 찾게되었다. WebKit의 글꼴 코드. Skew 변환이 포함되어 있습니다.

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 Sans"글꼴이 Lucida Grande와 사실상 동일하며 실제 이탤릭체 변형을 가지고 있다고 들었습니다.

따라서 기본적으로 다른 글꼴을 사용하고 있지만 완전히 승인해야합니다. 그러나 어떤 이유로 Lucida Sans 글꼴을 찾을 수없는 경우 SystemFontOfSize로 기본값을 다시 제외하고 필요한 경우 위의 변환을 적용합니다.

당신은 바위! -14.0 회전 대신 하나의 mod -16.0을 만들었으므로 사용자는 거대한 스프레드 시트에서 이탤릭체 값을 더 쉽게 찾을 수 있습니다. 내 문제는 비 루시 그란드 글꼴을 사용하면 UI 전반에 걸쳐 모든 종류의 수직 정렬 문제가 발생한다는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top