自定义字体显示在IB中,但不在模拟器中
我build立了一个UITextView
和一个UILabel
来使用自定义字体。 (这是一个垂直镜像蒙古字体,但我也包括英文文本,以便您可以看到效果。)在界面生成器中显示的单词,但在模拟器中的UITextView
中的大多数字符只是空的框。 奇怪的是,在UILabel
中的字符在模拟器中正确显示。
我怎么让他们也显示在UITextView
?
笔记:
- 我正在使用Xcode版本6.3.2。 从这个问题和答案我知道自定义字体应该在IB中使用Xcode 6。
- 我已将我的字体文件添加到项目,并从
UITextView
和UILabel
的自定义字体列表中select它。 - 我在项目的
Info.plist
添加了“由应用程序提供的字体”的关键字,并添加了我的自定义字体。 -
这个问题是一个非常相似的(但是不同,因为它没有提到
UITextView
和UILabel
问题)。 在写这篇文章的时候,OP的这个问题并没有表明最高票的答案是否有帮助。 我在那个答案中运行了代码,以确认我的字体真的在捆绑中。 我得到了以下结果,证实它在捆绑中,所以仍然不能解决我的问题。Family : ChimeeWhiteMirrored Font : ChimeeWhiteMirrored
有没有人看到我的错误或有任何其他的想法?
更新
收到@ darkheartfelt的downvote并评论我下面的回答,我重新创build了我原来的问题,也许我错过了一些东西。 尽pipe在iOS 9中,模拟器中的字体显示有所不同,但基本问题仍然存在:在IB中看起来不错,但在模拟器中看起来不错。
问题可以复制如下(使用Xcode 7.1.1):
- 开始一个新的单一视图项目。
- 将字体添加到项目中(可以从相关的github项目中下载)
- 在Info.plist文件中添加字体名称为“ChimeeWhiteMirrored.ttf”的“应用程序提供的字体”。
- 确认目标的“复制包资源”包含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)!) } }
如果我错了或错过了什么,请让我知道。 在此之前,我将不得不继续使用我接受的答案。
看来,当我第一次将字体导入到我的项目中时,我select了“添加到目标成员”,检查字体后,它没有被添加到目标! 它在Interface Builder中工作得很好,但是在sim或编译时没有工作。
在项目文件夹视图中select字体文件并检查目标成员资格框固定它:
创build2个类别类
-------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文件的名称来标记属性。
将自定义字体添加到您的iOS应用程序中的常见错误是一个有助于获取自定义字体正确显示的清单。 但是,在这种特殊情况下,这些事情都没有奏效。
除了在笔记中做的事情之外,还需要在代码中设置字体。 有几个选项可以做到这一点。
选项1:直接对其进行硬编码
这与如下操作一样简单:
myUITextView.font = UIFont(name: "ChimeeWhiteMirrored", size: myUITextView.font.pointSize)
请注意,名称是字体名称,而不是字体文件名称(ChimeeWhiteMirrored.ttf)。
选项2:用户定义的运行时属性
如果您想避免在代码中执行此操作,则可以使用“ 用户定义的运行时属性”来执行此操作 。 感谢@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) } } }
然后在视图的身份检查器中添加关键path,types和值,如下图所示。
选项3:IBInspectable
从我所读到的 ,使用用户定义的运行时属性是旧式的做法。 使用IBInspectable(和IBDesignable),您可以在Interface Builder中进行更改,并立即查看更改。
- IBInspectable / IBDesignable
- Xcode 6和iOS 8中的IBDesignables
- 使用IBDesignable构build自定义UI元素