[ios] iPhone 응용 프로그램에 사용자 정의 글꼴을 포함시킬 수 있습니까?

앱에 텍스트 렌더링을위한 사용자 정의 글꼴을 포함시키고로드 한 다음 UIKit과 같은 표준 요소와 함께 사용하고 싶습니다 UILabel. 이것이 가능한가?



답변

iOS 3.2 이상에서 지원합니다. 스트레이트에서 아이폰 OS 3.2의 새로운 기능 문서 :

사용자 정의 글꼴 지원 사용자 정의 글꼴
을 사용하려는 응용 프로그램은 이제 해당 응용 프로그램 번들에 해당 글꼴을 포함시키고 Info.plist 파일에 UIAppFonts 키를 포함시켜 해당 글꼴을 시스템에 등록 할 수 있습니다. 이 키의 값은 응용 프로그램 번들에서 글꼴 파일을 식별하는 문자열 배열입니다. 시스템은 키를 볼 때 지정된 글꼴을로드하여 응용 프로그램에서 사용할 수있게합니다.

글꼴이에서 설정되면 Info.plistIB의 다른 글꼴로 또는 프로그래밍 방식으로 사용자 지정 글꼴을 사용할 수 있습니다.

Apple 개발자 포럼에는
https://devforums.apple.com/thread/37824 스레드가 있습니다 (로그인 필요).

그리고 이것을 달성하는 방법에 대한 훌륭하고 간단한 3 단계 튜토리얼이 있습니다 (깨진 링크 제거)

  1. Xcode를 리소스로 사용하여 사용자 정의 글꼴 파일을 프로젝트에 추가
  2. Info.plist파일에 키를 추가하십시오 UIAppFonts.
  3. 이 키를 배열로 만듭니다
  4. 가지고있는 각 글꼴에 대해 UIAppFonts배열의 항목으로 글꼴 파일의 전체 이름 (확장명 포함)을 입력하십시오.
  5. 저장 Info.plist
  6. 이제 응용 프로그램에서 UILabelsUITextViews 등에 [UIFont fontWithName:@"CustomFontName" size:12]사용할 사용자 정의 글꼴을 얻기 위해 간단히 호출 할 수 있습니다 …

또한 : 글꼴이 사본 번들 자원에 있는지 확인하십시오.


답변

편집 : iOS 3.2 부터이 기능이 내장되어 있습니다. 3.2 이전을 지원 해야하는 경우이 솔루션을 계속 사용할 수 있습니다.

UILabel.ttf 파일로드 를 확장 하고 처리 하는 간단한 모듈을 만들었습니다 . Apache 라이센스에 따라 오픈 소스를 공개하고 github Here 에 넣었습니다 .

중요한 파일은 FontLabel.hFontLabel.m입니다.

Genericrich ‘s answer 의 코드 중 일부를 사용합니다 .

여기 에서 소스를 찾아보십시오 .

또는

  • 글꼴 파일을 리소스에 복사

  • Info.plistUIAppFonts라는 파일에 키를 추가하십시오 . ( “응용 프로그램에서 제공 한 글꼴)

  • 이 키를 배열로 만듭니다

  • 가지고있는 각 글꼴에 대해 UIAppFonts 배열의 항목으로 글꼴 파일 (확장명 포함)의 전체 이름을 입력하십시오.

  • 저장 Info.plist

  • 이제 응용 프로그램에서 간단하게 호출 [UIFont fontWithName:@"CustomFontName" size:15]하여 UILabelsand UITextViews등에서 사용할 사용자 정의 글꼴을 얻을 수 있습니다 .

자세한 내용은


답변

iOS 4 에서 커스텀 글꼴을 사용하는 간단한 방법이 있습니다 .

  1. (예를 들어, 글꼴 파일을 추가 Chalkduster.ttf로) 자원 엑스 코드에서 프로젝트의 폴더.
  2. info.plist이라는 새 키를 열고 추가하십시오 UIAppFonts. 이 키의 유형은 배열이어야합니다.
  3. 확장 ( Chalkduster.ttf)을 포함하여 사용자 정의 글꼴 이름을이 배열에 추가하십시오 .
  4. 이제 [UIFont fontWithName:@"Chalkduster" size:16]응용 프로그램에서 사용할 수 있습니다 .

불행히도 IB는 사용자 정의 글꼴로 레이블을 초기화 할 수 없습니다. 이 문제 를 해결하려면 이 질문 을 참조하십시오 . 내가 가장 좋아하는 솔루션은 사용자 정의 UILabel하위 클래스 를 사용하는 것입니다 .

@implementation CustomFontLabel

- (id)initWithCoder:(NSCoder *)decoder
{
    if (self = [super initWithCoder: decoder])
    {
        [self setFont: [UIFont fontWithName: @"Chalkduster" size: self.font.pointSize]];
    }
    return self;
}

@end


답변

Info.plist에서 “응용 프로그램에서 제공 한 글꼴”항목을 추가하고 글꼴 이름을 문자열로 포함하십시오.

Fonts provided by application
           Item 0        myfontname.ttf
           Item 1        myfontname-bold.ttf
           ...

그런 다음 다음을 실행하여 글꼴이 포함되어 있는지 확인하십시오.

for (NSString *familyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
         NSLog(@"%@", fontName);
    }
}

ttf 파일 이름은 레이블의 글꼴을 설정할 때 사용하는 이름과 다를 수 있습니다 (위의 코드를 사용하여 “fontWithName”매개 변수를 얻을 수 있음).

[label setFont:[UIFont fontWithName:@"MyFontName-Regular" size:18]];


답변

편집 :이 답변은 iOS3.2에서 없어졌습니다. UIAppFonts 사용

내가 성공적으로 사용자 정의를로드 할 수있는 유일한 방법 UIFont은 개인 GraphicsServices 프레임 워크를 사용하는 것입니다.

다음은 .ttf응용 프로그램의 기본 번들에있는 모든 글꼴을 로드합니다 .

BOOL GSFontAddFromFile(const char * path);
NSUInteger loadFonts()
{
    NSUInteger newFontCount = 0;
    for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
        newFontCount += GSFontAddFromFile([fontFile UTF8String]);
    return newFontCount;
}

글꼴이로드되면 Apple에서 제공 한 글꼴처럼 사용할 수 있습니다.

NSLog(@"Available Font Families: %@", [UIFont familyNames]);
[label setFont:[UIFont fontWithName:@"Consolas" size:20.0f]];

API가 나중에 사라질 경우를 대비하여 런타임에 GraphicsServices를로드 할 수도 있습니다.

#import <dlfcn.h>
NSUInteger loadFonts()
{
    NSUInteger newFontCount = 0;
    NSBundle *frameworkBundle = [NSBundle bundleWithIdentifier:@"com.apple.GraphicsServices"];
    const char *frameworkPath = [[frameworkBundle executablePath] UTF8String];
    if (frameworkPath) {
        void *graphicsServices = dlopen(frameworkPath, RTLD_NOLOAD | RTLD_LAZY);
        if (graphicsServices) {
            BOOL (*GSFontAddFromFile)(const char *) = dlsym(graphicsServices, "GSFontAddFromFile");
            if (GSFontAddFromFile)
                for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
                    newFontCount += GSFontAddFromFile([fontFile UTF8String]);
        }
    }
    return newFontCount;
}


답변

iOS 8+과 Xcode 6+ 당신은 쉽게 만들 수 있습니다. 단계는 다음과 같습니다.

1) 서체를 XcodeSupporting Files 폴더 로 끌어다 놓습니다 . 대상추가 섹션 에서 앱을 표시하는 것을 잊지 마십시오 . 지금부터이 글꼴을 사용 IB하고 글꼴 팔레트에서 선택할 수 있습니다.

여기에 이미지 설명을 입력하십시오

2) 장치에서이 글꼴을 사용할 수있게하려면 info.plistFonts provided by application키를 추가하십시오 . 항목 0 키를 포함하므로 글꼴 이름을 값으로 추가해야합니다. 글꼴 이름은 글꼴 파일 이름과 다를 수 있습니다. 그러나 먼저 대부분의 경우 파일 이름을 추가하십시오.

여기에 이미지 설명을 입력하십시오

그렇지 않은 경우이 기사는 항상 도움 되었습니다.

글꼴 이름을 찾는 데 도움이되는이 기사의 코드는 다음과 같습니다.

func allFonts(){

   for family in UIFont.familyNames(){

       println(family)


       for name in UIFont.fontNamesForFamilyName(family.description)
       {
           println("  \(name)")
       }

   }

}

편집하다

폰트 파일을 Target의 Build Phases , Copy Bundle Resources 에 추가해야한다고 언급하고 싶습니다 . 그렇지 않으면 장치에 글꼴이 표시되지 않습니다. 그리고 예기치 않은 행동으로 이어질 수 있습니다.

예를 들어, 내가가 발생 bug하는 경우, UITextField사용자 정의 글꼴을 가지고 있지만,이 글꼴은 아니었다 복사 번들 자원 . 그리고 viewcontrollerwith를 사용하면 함수가 호출 textfield되기 전에 약 4 초 지연 viewDidLoad됩니다. 글꼴 문제를 해결하면이 지연이 제거되었습니다. 따라서 두 번 확인하는 것이 좋습니다. (rdar : // 20028250) Btw, 버그를 재현 할 수 없었지만 문제가 글꼴에 있다고 확신합니다.


답변

나는 이것을 이렇게했다 :

글꼴을로드하십시오.

- (void)loadFont{
  // Get the path to our custom font and create a data provider.
  NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"mycustomfont" ofType:@"ttf"];
  CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]);

  // Create the font with the data provider, then release the data provider.
  customFont = CGFontCreateWithDataProvider(fontDataProvider);
  CGDataProviderRelease(fontDataProvider);
}

이제에서 drawRect:다음과 같이하십시오.

-(void)drawRect:(CGRect)rect{
    [super drawRect:rect];
    // Get the context.
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, rect);
    // Set the customFont to be the font used to draw.
    CGContextSetFont(context, customFont);

    // Set how the context draws the font, what color, how big.
    CGContextSetTextDrawingMode(context, kCGTextFillStroke);
    CGContextSetFillColorWithColor(context, self.fontColor.CGColor);
    UIColor * strokeColor = [UIColor blackColor];
    CGContextSetStrokeColorWithColor(context, strokeColor.CGColor);
    CGContextSetFontSize(context, 48.0f);

    // Create an array of Glyph's the size of text that will be drawn.
    CGGlyph textToPrint[[self.theText length]];

    // Loop through the entire length of the text.
    for (int i = 0; i < [self.theText length]; ++i) {
        // Store each letter in a Glyph and subtract the MagicNumber to get appropriate value.
        textToPrint[i] = [[self.theText uppercaseString] characterAtIndex:i] + 3 - 32;
    }
    CGAffineTransform textTransform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
    CGContextSetTextMatrix(context, textTransform);
    CGContextShowGlyphsAtPoint(context, 20, 50, textToPrint, [self.theText length]);
}

기본적으로 글꼴에서 오프셋을 찾기 위해 텍스트를 통해 루핑하고 매직 번호로 퍼징해야합니다 (29, 나를 사용하여 참조하십시오).하지만 작동합니다.

또한 글꼴을 합법적으로 포함 할 수 있는지 확인해야합니다. 대부분은 그렇지 않으며 이런 종류의 전문 변호사가 있으므로 경고하십시오.