自定义字体在 IB 中显示,但在模拟器中不显示
Custom font displays in IB but not in simulator
我已经设置了 UITextView
和 UILabel
来使用自定义字体。 (这是一个垂直镜像的蒙古字体,但我也包含了英文文本,以便您可以看到效果。)在Interface Builder中显示的文字,但在模拟器中 UITextView
中的大多数字符只是空的盒子。奇怪的是,在UILabel
中的字符在模拟器中确实显示正确。
如何让它们也显示在 UITextView
中?
备注:
- 我正在使用 Xcode 版本 6.3.2。从 this SO Q&A 我知道自定义字体应该在 IB 中与 Xcode 6 一起使用。
- 我已将我的字体文件添加到项目中,并从
UITextView
和 UILabel
的自定义字体列表中选择它。
- 我在项目的
Info.plist
中添加了关键字 "Fonts provided by application" 并向其中添加了自定义字体。
This question is a very similar one (but is different because it doesn't mention the UITextView
and UILabel
issue). At the time of this writing the OP for that question has not indicated if the top voted answer helped or not. I ran the code in that answer 以确认我的字体确实在捆绑包中。我得到以下结果,确认它在捆绑包中,所以仍然没有解决我的问题。
Family : ChimeeWhiteMirrored
Font : ChimeeWhiteMirrored
有没有人看到我的错误或有任何其他想法?
更新
在收到@darkheartfelt 的反对票和 对我下面的回答后,我重新创建了我原来的问题,认为我可能错过了一些东西。尽管在 iOS 9 中字体在模拟器中显示有些不同,但基本问题仍然存在:在 IB 中看起来不错,但在模拟器中却不行。
问题可以重现如下(使用Xcode 7.1.1):
- 开始一个新的单视图项目。
- 将字体添加到项目中(可以从相关 github 项目中下载 here)
- 在 Info.plist 文件中添加 "Fonts provided by application" 字体名称 "ChimeeWhiteMirrored.ttf".
- 确认目标的 "Copy Bundle Resources" 包含 ChimeeWhiteMirrored.ttf.
- 在情节提要中添加
UITextView
。
- 在 IB 属性检查器中粘贴以下文本:
1-10: one two three four five six seven eight nine ten
- 在 IB 属性检查器中,将字体设置为自定义,将字体系列设置为 ChimeeWhiteMirrored。
这重现了特殊字符的问题,正如我在下面的回答中所描述的,我发现唯一能解决这个问题的方法是在代码中设置字体。
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
// set custom font
textView.font = UIFont(name: "ChimeeWhiteMirrored", size: (textView.font?.pointSize)!)
}
}
如果我错了或遗漏了什么,请告诉我。在那之前,我将不得不继续使用下面我接受的答案。
创建 2 个类别类
-------UILabel+ChimeeWhiteMirrored.h--------------
#import <UIKit/UIKit.h>
@interface UILabel (ChimeeWhiteMirrored)
@property (nonatomic, copy) NSString* fontNamelight;
@property (nonatomic, copy) NSString* fontNamebold;
@property (nonatomic, copy) NSString* fontNameboldIltalic;
@property (nonatomic, copy) NSString* fontNameRegular;
@end
--------------------------------------------
-------UILabel+ChimeeWhiteMirrored.m--------------
#import "UILabel+ChimeeWhiteMirrored.h"
@implementation UILabel (ChimeeWhiteMirrored)
- (NSString *)fontNamelight {
return self.font.fontName;
}
- (NSString *)fontNamebold {
return self.font.fontName;
}
- (NSString *)fontNameRegular {
return self.font.fontName;
}
- (NSString *)fontNameboldIltalic {
return self.font.fontName;
}
- (void)setFontNameRegular:(NSString *)fontName {
self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
- (void)setFontNamelight:(NSString *)fontName {
self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
- (void)setFontNamebold:(NSString *)fontName {
self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
- (void)setFontNameboldIltalic:(NSString *)fontName {
self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
@end
--------------------------------------------
并在项目代码文件夹中添加 ttf 文件,而不是直接将 ttf 文件的名称添加到属性中的标签。
Common Mistakes With Adding Custom Fonts to Your iOS App 是使自定义字体正确显示的有用清单。但是,none 这些东西在这种特殊情况下有效。
除了你在笔记中做的事情,你还需要在代码中设置字体。有几个选项可以做到这一点。
选项 1:直接硬编码
这就像执行以下操作一样简单:
myUITextView.font = UIFont(name: "ChimeeWhiteMirrored", size: myUITextView.font.pointSize)
注意是字体名,不是字体文件名(ChimeeWhiteMirrored.ttf)。
选项 2:用户定义的运行时属性
如果您想避免在代码中这样做,您可以使用 User Defined Runtime Attributes。感谢@SandeepAgrawal 的这个想法。请支持他的回答。对我有用的 Swift 版本是
import UIKit
extension UITextView {
public var myFontName: String {
get {
return self.font.fontName
}
set {
self.font = UIFont(name: newValue, size: self.font.pointSize)
}
}
}
然后在视图的身份检查器中添加键路径、类型和值,如下图所示。
选项 3:IBInspectable
From what I have read,使用用户定义的运行时属性是老式的做法。使用 IBInspectable(和 IBDesignable)允许您在 Interface Builder 中进行更改并立即查看更改。
看来,当我第一次将字体导入我的项目时我选择了 "Add to target membership",在检查字体后,没有 添加到目标!它在 Interface Builder 中工作得很好,但在 sim 或编译时不起作用。
在项目文件夹视图中选择字体文件并选中目标成员框来修复它:
如果您使用的是 webfont,则 download.ttf 文件并将其放入您的项目中。不要忘记在 xcode
上勾选 copy items if needed
接下来将其添加到信息 plist
<key>UIAppFonts</key>
<array>
<string>Your fontname.ttf</string>
<string>Bakersfield Bold.ttf</string>
</array>
现在看看字体系列名称。您也可以在字体文件中找到它。从您下载的地方您也将到达那里。就像我添加的字体一样,ttf 文件名是:Bakersfield Bold.ttf 对于这个字体名是:Bakersfield-Bold 就是这样。喜欢
UIFont *helvFont = [UIFont fontWithName:@"Bakersfield-Bold" size:14.0];
我已经设置了 UITextView
和 UILabel
来使用自定义字体。 (这是一个垂直镜像的蒙古字体,但我也包含了英文文本,以便您可以看到效果。)在Interface Builder中显示的文字,但在模拟器中 UITextView
中的大多数字符只是空的盒子。奇怪的是,在UILabel
中的字符在模拟器中确实显示正确。
如何让它们也显示在 UITextView
中?
备注:
- 我正在使用 Xcode 版本 6.3.2。从 this SO Q&A 我知道自定义字体应该在 IB 中与 Xcode 6 一起使用。
- 我已将我的字体文件添加到项目中,并从
UITextView
和UILabel
的自定义字体列表中选择它。 - 我在项目的
Info.plist
中添加了关键字 "Fonts provided by application" 并向其中添加了自定义字体。 This question is a very similar one (but is different because it doesn't mention the
UITextView
andUILabel
issue). At the time of this writing the OP for that question has not indicated if the top voted answer helped or not. I ran the code in that answer 以确认我的字体确实在捆绑包中。我得到以下结果,确认它在捆绑包中,所以仍然没有解决我的问题。Family : ChimeeWhiteMirrored Font : ChimeeWhiteMirrored
有没有人看到我的错误或有任何其他想法?
更新
在收到@darkheartfelt 的反对票和
问题可以重现如下(使用Xcode 7.1.1):
- 开始一个新的单视图项目。
- 将字体添加到项目中(可以从相关 github 项目中下载 here)
- 在 Info.plist 文件中添加 "Fonts provided by application" 字体名称 "ChimeeWhiteMirrored.ttf".
- 确认目标的 "Copy Bundle Resources" 包含 ChimeeWhiteMirrored.ttf.
- 在情节提要中添加
UITextView
。 - 在 IB 属性检查器中粘贴以下文本:
1-10: one two three four five six seven eight nine ten
- 在 IB 属性检查器中,将字体设置为自定义,将字体系列设置为 ChimeeWhiteMirrored。
这重现了特殊字符的问题,正如我在下面的回答中所描述的,我发现唯一能解决这个问题的方法是在代码中设置字体。
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
// set custom font
textView.font = UIFont(name: "ChimeeWhiteMirrored", size: (textView.font?.pointSize)!)
}
}
如果我错了或遗漏了什么,请告诉我。在那之前,我将不得不继续使用下面我接受的答案。
创建 2 个类别类
-------UILabel+ChimeeWhiteMirrored.h--------------
#import <UIKit/UIKit.h>
@interface UILabel (ChimeeWhiteMirrored)
@property (nonatomic, copy) NSString* fontNamelight;
@property (nonatomic, copy) NSString* fontNamebold;
@property (nonatomic, copy) NSString* fontNameboldIltalic;
@property (nonatomic, copy) NSString* fontNameRegular;
@end
--------------------------------------------
-------UILabel+ChimeeWhiteMirrored.m--------------
#import "UILabel+ChimeeWhiteMirrored.h"
@implementation UILabel (ChimeeWhiteMirrored)
- (NSString *)fontNamelight {
return self.font.fontName;
}
- (NSString *)fontNamebold {
return self.font.fontName;
}
- (NSString *)fontNameRegular {
return self.font.fontName;
}
- (NSString *)fontNameboldIltalic {
return self.font.fontName;
}
- (void)setFontNameRegular:(NSString *)fontName {
self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
- (void)setFontNamelight:(NSString *)fontName {
self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
- (void)setFontNamebold:(NSString *)fontName {
self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
- (void)setFontNameboldIltalic:(NSString *)fontName {
self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
@end
--------------------------------------------
并在项目代码文件夹中添加 ttf 文件,而不是直接将 ttf 文件的名称添加到属性中的标签。
Common Mistakes With Adding Custom Fonts to Your iOS App 是使自定义字体正确显示的有用清单。但是,none 这些东西在这种特殊情况下有效。
除了你在笔记中做的事情,你还需要在代码中设置字体。有几个选项可以做到这一点。
选项 1:直接硬编码
这就像执行以下操作一样简单:
myUITextView.font = UIFont(name: "ChimeeWhiteMirrored", size: myUITextView.font.pointSize)
注意是字体名,不是字体文件名(ChimeeWhiteMirrored.ttf)。
选项 2:用户定义的运行时属性
如果您想避免在代码中这样做,您可以使用 User Defined Runtime Attributes。感谢@SandeepAgrawal 的这个想法。请支持他的回答。对我有用的 Swift 版本是
import UIKit
extension UITextView {
public var myFontName: String {
get {
return self.font.fontName
}
set {
self.font = UIFont(name: newValue, size: self.font.pointSize)
}
}
}
然后在视图的身份检查器中添加键路径、类型和值,如下图所示。
选项 3:IBInspectable
From what I have read,使用用户定义的运行时属性是老式的做法。使用 IBInspectable(和 IBDesignable)允许您在 Interface Builder 中进行更改并立即查看更改。
看来,当我第一次将字体导入我的项目时我选择了 "Add to target membership",在检查字体后,没有 添加到目标!它在 Interface Builder 中工作得很好,但在 sim 或编译时不起作用。
在项目文件夹视图中选择字体文件并选中目标成员框来修复它:
如果您使用的是 webfont,则 download.ttf 文件并将其放入您的项目中。不要忘记在 xcode
上勾选 copy items if needed接下来将其添加到信息 plist
<key>UIAppFonts</key>
<array>
<string>Your fontname.ttf</string>
<string>Bakersfield Bold.ttf</string>
</array>
现在看看字体系列名称。您也可以在字体文件中找到它。从您下载的地方您也将到达那里。就像我添加的字体一样,ttf 文件名是:Bakersfield Bold.ttf 对于这个字体名是:Bakersfield-Bold 就是这样。喜欢
UIFont *helvFont = [UIFont fontWithName:@"Bakersfield-Bold" size:14.0];