Swift 5.0自定义键盘:如何实现按钮及输入文本用自定义字体?
解决Swift键盘扩展中自定义字体不生效的问题
看起来你在键盘扩展里使用自定义字体时遇到了两个核心问题:一是键盘按钮本身不显示指定字体,二是插入到其他应用的文本无法使用该字体。我来一步步帮你解决:
一、先解决键盘按钮显示自定义字体的问题
你的代码里有个明显的错误:UIFont初始化时传入的是字体文件名(带.ttf后缀),但实际上应该传入字体的「显示名称」,比如Montague.ttf对应的字体名称可能就是Montague(具体可以通过代码验证)。除此之外,还要确保字体文件正确添加到键盘扩展的Target中,并且配置了Info.plist。
步骤1:正确添加字体到项目
- 把
Montague.ttf拖入项目,确保勾选了主应用和键盘扩展两个Target - 在主应用和键盘扩展的
Info.plist中,添加Fonts provided by application字段(数组类型),并把Montague.ttf作为元素加入
步骤2:确认字体的正确名称
可以在键盘扩展的viewDidLoad中添加这段代码,打印所有可用的字体名称,找到你的自定义字体:
override func viewDidLoad() { super.viewDidLoad() // 打印所有可用字体家族 for family in UIFont.familyNames { print("Family: \(family)") for font in UIFont.fontNames(forFamilyName: family) { print(" Font: \(font)") } } // ... 其他代码 }
运行后在控制台找到Montague对应的字体名称,比如可能就是Montague。
步骤3:修改代码中的字体初始化
把你代码中所有UIFont(name: "Montague.ttf", size: 15)替换成正确的字体名称,比如:
button.titleLabel?.font = UIFont(name: "Montague", size: 15)
另外,你的按钮没有添加Auto Layout约束,可能会显示不出来,建议在viewDidLoad中添加约束:
override func viewDidLoad() { super.viewDidLoad() let button = createButton(title: "A") self.view.addSubview(button) // 添加约束让按钮居中 NSLayoutConstraint.activate([ button.centerXAnchor.constraint(equalTo: view.centerXAnchor), button.centerYAnchor.constraint(equalTo: view.centerYAnchor) ]) }
二、关于插入文本到其他应用显示自定义字体的说明
这里要纠正一个认知:通过textDocumentProxy.insertText(_:)插入的是纯文本,文本的字体是由接收文本的应用决定的,键盘无法强制其他应用使用你的自定义字体。
如果想要让其他应用显示你的自定义字体,有两种可行思路:
- 要求用户在目标应用中也安装该自定义字体(但这显然不符合「任意应用」的需求)
- 把文本转换成自定义的图片/表情符号(比如生成对应字体的图片,然后作为表情插入,但这需要额外的处理,且体验不如纯文本)
所以如果你的核心需求是让键盘按钮显示自定义字体,上面的步骤就能解决;如果要让插入的文本在任意应用显示该字体,这个方案的局限性很大,可能需要重新考虑实现思路。
修改后的完整代码
class KeyboardViewController: UIInputViewController { override func viewDidLoad() { super.viewDidLoad() // 可选:打印所有可用字体,确认自定义字体是否加载成功 for family in UIFont.familyNames { print("Family: \(family)") for font in UIFont.fontNames(forFamilyName: family) { print(" Font: \(font)") } } let button = createButton(title: "A") self.view.addSubview(button) // 添加Auto Layout约束,让按钮居中显示 NSLayoutConstraint.activate([ button.centerXAnchor.constraint(equalTo: view.centerXAnchor), button.centerYAnchor.constraint(equalTo: view.centerYAnchor) ]) } func createButton(title: String) -> UIButton { let button = UIButton(type: .system) button.setTitle(title, for: .normal) button.sizeToFit() button.translatesAutoresizingMaskIntoConstraints = false // 使用正确的字体名称,不要带.ttf后缀 button.titleLabel?.font = UIFont(name: "Montague", size: 15) button.backgroundColor = .white button.setTitleColor(.darkGray, for: .normal) button.addTarget(self, action: #selector(didTapButton(sender:)), for: .touchUpInside) return button } @objc func didTapButton(sender: UIButton) { guard let title = sender.title(for: .normal) else { return } // 插入纯文本,字体由接收应用决定 textDocumentProxy.insertText(title) } }
内容的提问来源于stack exchange,提问作者Mikail Izaev
相关产品推荐
相关产品推荐

