在 iOS 应用程序中使用故事板为每种语言使用不同的字体

问题描述 投票:0回答:1

我面临一个问题,我需要为我的应用程序支持的每种语言使用不同的字体。
例如:我需要对格鲁吉亚语使用“Arial”,对英语使用“Times new roman”。
嗯,显然有很多方法可以通过编程方式解决这个问题,但是如何使用故事板来完成呢?

我在视图控制器上有一个 UILabel,它是从 Storyboard 加载的。如果我在 iPhone 设置 >> 常规 >> 语言和区域 >> 首选语言顺序中选择“格鲁吉亚语”语言并打开应用程序,则标签的字体应为“Arial”,但如果我在 iPhone 中选择“英语”语言设置中,标签的字体应为“Times new roman”。

注意:标签代码不应有任何故事板出口。

我想到的唯一一件事就是将 @IBInspectable 属性实现为 UILabel 扩展,并在其中编写部分代码:

extension UILabel {
    @IBInspectable var adjustFont: Bool {
        get { return false } // we don't care about return value
        set { // this is where the game starts
            if newValue {
                switch systemLanguage {
                case .Georgian:
                    self.font = UIFont(name: "Arial", size: 17)
                case .English:
                    self.font = UIFont(name: "Times new roman", size: 17)
                }
            }
        }
    }
}

嗯,这是一种解决方案,但我正在寻找更优雅/正确的方法。

任何帮助/建议都会有帮助。
谢谢你

ios objective-c swift storyboard uistoryboard
1个回答
0
投票

我这样做的方法是创建一个 BaseLabel 类,如下所示......对于 ar 和 en ...

import UIKit

class BaseLabel: UILabel {
    @IBInspectable var arabicText:String = "" {
        didSet{
            setNeedsLayout()
        }
    }
    
    @IBInspectable var englishText:String = "" {
        didSet{
            setNeedsLayout()
        }
    }
    
    @IBInspectable var changeAlignment : Bool = true {
        didSet{
            setNeedsLayout()
        }
    }
    
    override func layoutSubviews() {
        if arabicText != "" || englishText != "" {
            self.text = getCurrentLanguge() == .ar ? arabicText : englishText
        }
        if self.changeAlignment && textAlignment != .center{
            self.textAlignment = getCurrentLanguge() == .ar ? .right : .left
        }
        setFont()
    }
    
    @IBInspectable var fontSize: CGFloat = 13 {
        didSet {
            setFont()
        }
    }
    @IBInspectable var fontType: Int = 2 {
        didSet {
            setFont()
        }
    }
    
    func setFont() {
        if fontType == 1 {
            if getCurrentLanguge() == .en {
                self.font = UIFont(name: AppFonts.regularEn, size: UIDevice.isRunningOnIpad ? self.fontSize + 10.0 : self.fontSize)!
            } else {
                self.font = UIFont(name: AppFonts.regularAr, size: UIDevice.isRunningOnIpad ? self.fontSize + 10.0 : self.fontSize)!
            }
        }
        if fontType == 2 {
            if getCurrentLanguge() == .en {
                self.font = UIFont(name: AppFonts.boldEn, size: UIDevice.isRunningOnIpad ? self.fontSize + 10.0 : self.fontSize)!
            } else {
                self.font = UIFont(name: AppFonts.boldAr, size: UIDevice.isRunningOnIpad ? self.fontSize + 10.0 : self.fontSize)!
            }
        }
        
    }
}

其中 AppFonts 是一个如下所示的结构...

struct AppFonts {
    
    static let fontSizeIPadButton = 24.0
    static let fontSizeButton = 17.0
    
    static let regularEn = "MyEnglishFontName-Regular"
    static let boldEn = "MyEnglishFontName-Bold"

    static let regularAr =  "MyArabicFontName-Regular"
    static let boldAr = "MyArabicFontName-Bold"
    
}

而 UIDevice 是一个为 ipad 带来改变的扩展...

extension UIDevice {
    static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
}

当您将

BaseLabel
类分配给故事板中的标签时,现在您可以控制故事板中的字体...

© www.soinside.com 2019 - 2024. All rights reserved.