自定义字体显示在IB中,但不在模拟器中显示

时间:2015-06-24 06:09:42

标签: ios xcode fonts interface-builder mongolian-vertical-script

我已设置UITextViewUILabel以使用自定义字体。 (它是一个垂直镜像的蒙古语字体,但我还包括英文文本,以便您可以看到效果。)单词显示在Interface Builder中,但在模拟器中UITextView中的大多数字符都是空的框。奇怪的是,UILabel中的字符在模拟器中正确显示。

如何让它们也显示在UITextView中?

enter image description here

注意:

  • 我正在使用Xcode版本6.3.2。从this SO Q&A我知道自定义字体应该与IB中的Xcode 6一起使用。
  • 我已将我的字体文件添加到项目中,并从UITextViewUILabel的自定义字体列表中选择了它。
  • 我在项目的Info.plist中添加了“应用程序提供的字体”键,并将自定义字体添加到其中。 enter image description here
  • This question非常相似(但不同,因为它没有提到UITextViewUILabel问题)。在撰写本文时,该问题的OP并未表明最高投票答案是否有帮助。我在that answer中运行代码以确认我的字体确实在捆绑中。我得到了以下结果,证实它在捆绑中,所以仍然无法解决我的问题。

    Family : ChimeeWhiteMirrored
        Font : ChimeeWhiteMirrored
    

有人看到我的错误或有任何其他想法吗?

更新

收到@ darkheartfelt的downvote和comment到我的答案后,我重新创建了我原来的问题,想想也许我错过了什么。虽然在iOS 9中,字体在模拟器中的显示方式有所不同,但基本问题仍然存在:它在IB中看起来不错,但在模拟器中看起来不行。

enter image description here

问题可以如下重现(使用Xcode 7.1.1):

  1. 启动新的单一视图项目。
  2. 将字体添加到项目中(可以从相关的github项目下载here
  3. 在Info.plist文件中添加“应用程序提供的字体”,字体名称为“ChimeeWhiteMirrored.ttf”。
  4. 确认目标的“复制包资源”包含ChimeeWhiteMirrored.ttf。
  5. 在故事板中添加UITextView
  6. 在“IB属性”检查器中粘贴以下文本:1-10:           one two three four five six seven eight nine ten
  7. 在“IB属性”检查器中,将字体设置为“自定义”,将族设置为“ChimeeWhiteMirrored”。
  8. 这再现了特殊字符的问题,正如我在下面的回答中所描述的那样,我发现解决这个问题的唯一方法就是在代码中设置字体。

    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)!)
        }
    }
    

    如果我错了或遗失了什么,请告诉我。在那之前,我将不得不继续使用我接受的答案。

4 个答案:

答案 0 :(得分:24)

看来,当我第一次将字体导入我的项目时,我选择了“添加到目标会员”,在检查字体后,添加到目标中!它在Interface Builder中运行得很好,但在sim或编译时无效。

在项目文件夹视图中选择字体文件并检查目标成员资格框,修复它:

答案 1 :(得分:1)

创建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文件的名称添加到属性中的标签。

enter image description here

答案 2 :(得分:1)

Common Mistakes With Adding Custom Fonts to Your iOS App是一个有用的清单,可以让自定义字体正确显示。但是,在这种特殊情况下,这些都不起作用。

除了您在笔记中所做的事情之外,您还需要在代码中设置字体。这样做有几种选择。

选项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)
        }
    }
}

然后在视图的标识检查器中添加关键路径,类型和值,如下图所示。

enter image description here

选项3:IBInspectable

From what I have read,使用用户定义的运行时属性是一种老式的方式。使用IBInspectable(和IBDesignable)允许您在Interface Builder中进行更改并立即查看更改。

答案 3 :(得分:1)

如果您使用的是webfont,请下载.ttf文件并将其放入您的项目中。不要忘记在xcode上复制项目上的复选标记

接下来在info 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];