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

4
我面临一个问题,我的应用程序需要为每种支持的语言使用不同的字体。 例如:我需要在格鲁吉亚语中使用“Arial”字体,在英语中使用“Times new roman”字体。 显然,有很多编程方法可以解决这个问题,但如何在storyboards中实现呢?
我在视图控制器上有一个从Storyboard加载的UILabel。如果我在iPhone设置中选择“格鲁吉亚”语言>>常规>>语言和地区>>首选语言顺序,并打开应用程序,则标签的字体应为“Arial”,但如果我选择“英语”语言,则标签的字体应为“Times new roman”。
注意:对于标签,代码中不应该有任何storyboard输出。
唯一想到的做法是将@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)
                }
            }
        }
    }
}

嗯,这是一种解决方案,但我正在寻找更优雅/正确的方法来做这件事。
任何帮助/建议都将非常有用。 谢谢。

你好,你有没有找到其他可以分享的解决方案? - Mahmoud Zinji
我认为,不幸的是,在没有IBInspectable属性的情况下,通过故事板/ xib实现这一点没有其他方法。 或者实现一些代码的部分,可以做到这一点(我猜设计系统可能是最优雅的方式)。 - Rendel
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类分配给故事板中的标签时,现在你可以从故事板中控制字体...

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接