앱에 텍스트 렌더링을위한 사용자 정의 글꼴을 포함시키고로드 한 다음 UIKit
과 같은 표준 요소와 함께 사용하고 싶습니다 UILabel
. 이것이 가능한가?
답변
iOS 3.2 이상에서 지원합니다. 스트레이트에서 아이폰 OS 3.2의 새로운 기능 문서 :
사용자 정의 글꼴 지원 사용자 정의 글꼴
을 사용하려는 응용 프로그램은 이제 해당 응용 프로그램 번들에 해당 글꼴을 포함시키고 Info.plist 파일에 UIAppFonts 키를 포함시켜 해당 글꼴을 시스템에 등록 할 수 있습니다. 이 키의 값은 응용 프로그램 번들에서 글꼴 파일을 식별하는 문자열 배열입니다. 시스템은 키를 볼 때 지정된 글꼴을로드하여 응용 프로그램에서 사용할 수있게합니다.
글꼴이에서 설정되면 Info.plist
IB의 다른 글꼴로 또는 프로그래밍 방식으로 사용자 지정 글꼴을 사용할 수 있습니다.
Apple 개발자 포럼에는
https://devforums.apple.com/thread/37824 스레드가 있습니다 (로그인 필요).
그리고 이것을 달성하는 방법에 대한 훌륭하고 간단한 3 단계 튜토리얼이 있습니다 (깨진 링크 제거)
- Xcode를 리소스로 사용하여 사용자 정의 글꼴 파일을 프로젝트에 추가
Info.plist
파일에 키를 추가하십시오UIAppFonts
.- 이 키를 배열로 만듭니다
- 가지고있는 각 글꼴에 대해
UIAppFonts
배열의 항목으로 글꼴 파일의 전체 이름 (확장명 포함)을 입력하십시오. - 저장
Info.plist
- 이제 응용 프로그램에서 UILabels 및 UITextViews 등에
[UIFont fontWithName:@"CustomFontName" size:12]
사용할 사용자 정의 글꼴을 얻기 위해 간단히 호출 할 수 있습니다 …
또한 : 글꼴이 사본 번들 자원에 있는지 확인하십시오.
답변
편집 : iOS 3.2 부터이 기능이 내장되어 있습니다. 3.2 이전을 지원 해야하는 경우이 솔루션을 계속 사용할 수 있습니다.
UILabel
.ttf 파일로드 를 확장 하고 처리 하는 간단한 모듈을 만들었습니다 . Apache 라이센스에 따라 오픈 소스를 공개하고 github Here 에 넣었습니다 .
중요한 파일은 FontLabel.h
및 FontLabel.m
입니다.
Genericrich ‘s answer 의 코드 중 일부를 사용합니다 .
또는
-
글꼴 파일을 리소스에 복사
-
Info.plist
UIAppFonts라는 파일에 키를 추가하십시오 . ( “응용 프로그램에서 제공 한 글꼴) -
이 키를 배열로 만듭니다
-
가지고있는 각 글꼴에 대해 UIAppFonts 배열의 항목으로 글꼴 파일 (확장명 포함)의 전체 이름을 입력하십시오.
-
저장
Info.plist
-
이제 응용 프로그램에서 간단하게 호출
[UIFont fontWithName:@"CustomFontName" size:15]
하여UILabels
andUITextViews
등에서 사용할 사용자 정의 글꼴을 얻을 수 있습니다 .
답변
iOS 4 에서 커스텀 글꼴을 사용하는 간단한 방법이 있습니다 .
- (예를 들어, 글꼴 파일을 추가
Chalkduster.ttf
로) 자원 엑스 코드에서 프로젝트의 폴더. info.plist
이라는 새 키를 열고 추가하십시오UIAppFonts
. 이 키의 유형은 배열이어야합니다.- 확장 (
Chalkduster.ttf
)을 포함하여 사용자 정의 글꼴 이름을이 배열에 추가하십시오 . - 이제
[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) 서체를 Xcode
Supporting Files 폴더 로 끌어다 놓습니다 . 대상 에 추가 섹션 에서 앱을 표시하는 것을 잊지 마십시오 . 지금부터이 글꼴을 사용 IB
하고 글꼴 팔레트에서 선택할 수 있습니다.
2) 장치에서이 글꼴을 사용할 수있게하려면 info.plist
및 Fonts 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
사용자 정의 글꼴을 가지고 있지만,이 글꼴은 아니었다 복사 번들 자원 . 그리고 viewcontroller
with를 사용하면 함수가 호출 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, 나를 사용하여 참조하십시오).하지만 작동합니다.
또한 글꼴을 합법적으로 포함 할 수 있는지 확인해야합니다. 대부분은 그렇지 않으며 이런 종류의 전문 변호사가 있으므로 경고하십시오.