Phông chữ tùy chỉnh trong iOS 7


102

Tôi đang phát triển một trò chơi và tôi muốn sử dụng phông chữ tùy chỉnh trong ứng dụng của mình. Tôi đang sử dụng SpriteKit cho nó, nếu điều đó quan trọng. Tôi đã thử sử dụng https://github.com/deni2s/IBCustomFonts này nhưng tôi không thể làm cho nó hoạt động với phông chữ này http://www.fontspace.com/freaky-fonts/emulogic

Tôi đã thử nhiều thứ khác nhau và tôi đã đăng ký phông chữ trên info.plist của ứng dụng ... Có ai biết chuyện gì đang xảy ra không?


Bạn có chắc mình đang sử dụng tên chính xác cho phông chữ khi sử dụng nó trong mã của mình không?
Nick

1
blog này có thể hữu ích cho bạn codewithchris.com/…
Xu Yin

Câu trả lời:


277

Trước hết, tôi giả định rằng SpriteKit không tạo ra bất kỳ sự khác biệt nào.

  1. Bạn cần sao chép phông chữ .otf hoặc .ttf vào dự án của mình. Ví dụ trong các tệp hỗ trợ.
  2. Bạn cần chỉnh sửa tệp .plist . Thêm khóa "Phông chữ do ứng dụng cung cấp" vào bảng xếp hạng của bạn và trong Mục 0, sao chép tên tệp chính xác của phông chữ bạn đã sao chép vào tệp hỗ trợ CÓ phần mở rộng. Ví dụ: "JosefinSansStd-Light_0.otf"
  3. Đảm bảo rằng phông chữ bạn đã nhập vào ứng dụng của mình đang được đóng gói vào chính ứng dụng. Làm điều đó bằng cách chọn Mục tiêu của bạn , sau đó Xây dựng các giai đoạn , sau đó Sao chép Tài nguyên Gói . Nếu bạn không thấy phông chữ của mình trong đó, hãy kéo phông chữ đó khỏi Tệp hỗ trợ .

Cuối cùng, bạn muốn liệt kê tất cả các phông chữ của mình khi ứng dụng khởi động chỉ để xem tên có thể sử dụng cho phông chữ của bạn. Bạn sẽ làm được điều đó với đoạn mã nhỏ này:

NSArray *fontFamilies = [UIFont familyNames];
for (int i = 0; i < [fontFamilies count]; i++)
{
    NSString *fontFamily = [fontFamilies objectAtIndex:i];
    NSArray *fontNames = [UIFont fontNamesForFamilyName:[fontFamilies objectAtIndex:i]];
    NSLog (@"%@: %@", fontFamily, fontNames);
}

Tìm kiếm phông chữ của bạn trong kết quả in, ví dụ: tôi sẽ tìm kiếm "Josefin" và tôi sẽ thấy tên phông chữ thực tế đó là "JosefinSansStd-Light". Sau đó, bạn chỉ cần sử dụng phông chữ đó bằng cách:

UIFont *customFont = [UIFont fontWithName:@"JosefinSansStd-Light" size:20];

Trong iOS8, bạn thêm phông chữ của mình trực tiếp vào dự án và chúng hiển thị trong trình tạo giao diện. Sửa đổi mã của bạn để giải quyết vấn đề này nhưng đặt phông chữ theo chương trình cho iOS7 và chọn nó trong trình tạo giao diện xCode6. Tái bút. Trình tạo giao diện trong xCode6 cung cấp cho bạn tên phông chữ chính xác mà bạn có thể sao chép-dán vào mã bên dưới.

#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

 if(SYSTEM_VERSION_LESS_THAN(@"8.0"))
    {
        UIFont *customFont = [UIFont fontWithName:@"OpenSans-Light" size:32];
        self.registerLabel.font = customFont;  
    }

Hy vọng điều này sẽ giúp, cổ vũ.


Cảm ơn! Tôi hiểu rồi! Vấn đề là tôi không thêm nó vào các Tệp hỗ trợ, vì vậy nó không tải được: P
José María

1
Tôi đã phải sử dụng phím plist củaUIAppFonts
Mike Flynn

1
Tôi đã tạo lại ứng dụng của mình, toàn bộ dự án từ iOS7 / Xcode 5.1.1 thành dự án iOS8 / Xcode 6.0. Phông chữ tùy chỉnh đã không hiển thị cho đến khi tôi thực hiện bước 2.. Gr8 giải thích!
MB_iOSDeveloper

1
Mã tương tự để lấy tên phông chữ trong Swift: let fontFamilies = UIFont.familyNames() for familyName in fontFamilies { let fontNames = UIFont.fontNamesForFamilyName(familyName as String) println("\(familyName): \(fontNames)") }
Alexander Bekert

1
Một số mã nhanh chóng để in tất cả các tên phông chữ:for name in UIFont.familyNames() { debugPrint(UIFont.fontNamesForFamilyName(name)) }
gimenete

24

Không có vấn đề gì khi sử dụng phông chữ tùy chỉnh, tôi đã làm được. Làm theo các bước sau:

  1. Đăng ký phông chữ trong info.plist của bạn bằng cách thêm mục "Phông chữ do ứng dụng cung cấp". Đặt tên tệp phông chữ, không đặt tên phông chữ. Giống như font.ttf (Tôi nghĩ bạn đã làm điều đó)
  2. Đi tới dự án của bạn trên trình điều hướng dự án, nhấp vào tên dự án và đi đến "giai đoạn xây dựng" sau đó nhìn xuống "Bản sao gói tài nguyên" ở phía dưới, có rất nhiều tệp và tìm kiếm dấu "+". Một cửa sổ bật lên sẽ mở ra với các tệp dự án của bạn. Tìm kiếm tệp phông chữ của bạn và thêm nó vào nhóm.
  3. Cuối cùng là kiểm tra tên phông chữ. Khi bạn sử dụng nó trong mã của mình, bạn phải sử dụng tên phông chữ, không phải tên tệp. Để biết tên phông chữ, hãy nhấp đúp vào tệp phông chữ trong Finder và một cửa sổ sẽ mở ra hiển thị phông chữ. Kiểm tra tiêu đề cửa sổ, đó là tên của phông chữ mà bạn phải sử dụng.

Và lời khuyên, hãy thêm tên đó làm macro trong tệp ..Prefix.pch của bạn. Sẽ dễ dàng hơn để sử dụng nó trong dự án của bạn nếu bạn phải sử dụng phông chữ nhiều lần.

Vấn đề mà tôi nghĩ bạn gặp phải là bạn đã đăng ký phông chữ đúng cách nhưng nó không được sao chép vào gói ứng dụng. Vì vậy, khi ứng dụng thực thi, nó không thể tìm thấy phông chữ. Đó là lý do tại sao bước 2 là quan trọng. Tôi đã dành rất nhiều thời gian để cố gắng tìm ra điều đó trong lần đầu tiên :)


2
Điều quan trọng đối với tôi là tiêu đề của phông chữ. Cảm ơn!
Oscar

20

Để đạt được điều này nhanh chóng

Nếu bạn muốn liệt kê tất cả các phông chữ của mình khi ứng dụng khởi động chỉ để xem tên có thể sử dụng cho phông chữ của bạn. Bạn có thể làm điều đó với đoạn mã nhỏ này:

    UIFont.familyNames.forEach {
        print("fontFamily: \($0), fonts: \(UIFont.fontNames(forFamilyName: $0))")
    }

hoặc vớiUIFont.familyNames.forEach { print("fontFamily: \($0), fonts: \(UIFont.fontNames(forFamilyName: $0))") }
Daniel

5

Tôi chưa bao giờ có thể làm cho những câu trả lời này thành công khi đã thử nhiều lần. Cách duy nhất tôi từng có một phông chữ tùy chỉnh trong đó là làm theo hướng dẫn trong câu trả lời được chấp nhận, sau đó tạo một nhãn ẩn trong bảng câu chuyện sử dụng phông chữ đó. Tôi có thể sử dụng phông chữ theo chương trình. Kỳ lạ và hacky tôi biết nhưng nó đã hiệu quả với tôi.


1
bạn hoàn toàn đúng. Tôi đã xem xét mọi thứ trong nhiều hướng dẫn, bao gồm cả plist, dấu kiểm cho mục tiêu của dự án, các giai đoạn xây dựng và cuối cùng đã tìm thấy tên họ phông chữ chính xác, nhưng nó vẫn không hoạt động. Sau đó, tôi đã thêm một nhãn ẩn như bạn nói và cuối cùng nó đã xuất hiện. Tôi đang sử dụng Xcode 7.2 và nó phải là một lỗi.
DrZ214 21/12/15

3

Nếu bạn đang sử dụng Xcode 6, nó sẽ dễ dàng như vậy. Chỉ cần thêm một fontthư mục vào dự án của bạn, thêm (các) phông chữ của bạn vào thư mục và bạn đã sẵn sàng.

nhập mô tả hình ảnh ở đây


7
Đảm bảo rằng bạn cũng thêm nó vào mục tiêu dự định của mình. Xcode của người Hobbit lén lút.
Matt Parkins

3

Nếu không có phương pháp nào ở trên phù hợp với bạn VÀ tình cờ bạn chỉ sử dụng phông chữ tùy chỉnh của mình "theo chương trình" (tức là bạn không sử dụng nó trong bất kỳ xib nào) thì bạn sẽ cần phải sử dụng nó ít nhất một lần ở đâu đó trong một xib, ở bất kỳ đâu .

(PS Stuart Clark - đã trả lời câu này, vì vậy tôi không có tín dụng nào cho tôi. Tuy nhiên, tôi quyết định nói lại và đăng nó dưới dạng một câu trả lời riêng biệt, bởi vì tôi bỏ lỡ câu trả lời của anh ấy, tôi không rõ khi đọc nó. Tôi thấy tình cờ đưa ra giải pháp này khi tôi đang thử nghiệm phông chữ tùy chỉnh trong xib và tôi thấy rằng nó hoạt động ở nơi khác theo chương trình, nhưng khi tôi xóa phông chữ khỏi xib, nó ngừng hoạt động theo chương trình.)


2

Đã cập nhật cho Swift 3.

let fontFamilies:[String] = UIFont.familyNames

for fontFamily: String in fontFamilies {
    let fontNames: [String] = UIFont.fontNames(forFamilyName: fontFamily)
    print("\(fontFamily)  \(fontNames)");
}

0

Có thể là một bản sửa lỗi nhanh chóng - điều này đã làm được với tôi khi phông chữ đã hoạt động, nhưng một ví dụ mới như Nhãn không hiển thị phông chữ mong muốn:

sạch, sạch sâu và thư mục dữ liệu dẫn xuất trống.


0
please try below code.
@end
@implementation UILabel (CustomFont)
-(void)setFontName:(NSString *)value{
CGFloat newsize = (self.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self setFont:[UIFont fontWithName:self.font.fontName size:newsize]];
}
@end
@implementation UITextField (CustomFont)
-(void)setFontName:(NSString *)value{
CGFloat newsize = (self.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self setFont:[UIFont fontWithName:self.font.fontName size:newsize]];
}
@end
@implementation UIButton (CustomFont)
-(void)setFontName:(NSString *)value{
CGFloat newsize = (self.titleLabel.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self.titleLabel setFont:[UIFont fontWithName:self.titleLabel.font.fontName size:newsize]];
}
@end
@end

@interface UILabel (CustomFont)
-(void)setFontName:(NSString *)value;
@end
@interface UITextField (CustomFont)
-(void)setFontName:(NSString *)value;
@end
@interface UIButton (CustomFont)
-(void)setFontName:(NSString *)value;
@end
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.