You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:32:17