semanticContentAttribute不起作用

时间:2018-03-14 12:26:56

标签: ios swift localization

在我的应用中有三种语言,即 ar fr &的 EN 即可。并且基于应用程序语言正在改变应用程序语言和语义。

在我的应用中,应用语言根据要求进行了适当的更改,但其语义没有变化。

以下是用户更改语言时我正在尝试的代码。

let cur_lang = Localize.currentLanguage()
    print("current lang; \(cur_lang)")
    if cur_lang == "ar"{
        UIView.appearance().semanticContentAttribute = .forceRightToLeft
    }
    else{
        UIView.appearance().semanticContentAttribute = .forceLeftToRight
    }

    imgView.image = UIImage(named: "flag".localized())
    lblTitle.text = "Title".localized()
    lblDescription.text = "Description".localized()
    lblName.text = "Name".localized()
    tfName.text = "textName".localized()

这是屏幕的GIF。

enter image description here

必填项:

enter image description here

  

修改

如果我在视图中获取所有内容,那么它按预期工作,但natural text alignment和导航栏仍未受影响。

如果存在复杂的布局,则无法翻转每个视图,因为它可能会降低应用程序性能。

所以我尝试self.view.semanticContentAttribute = .forceRightToLeft并没有任何区别。

我的每个UI组件都有前导不是左右,并且还选择了尊重语言方向

enter image description here

5 个答案:

答案 0 :(得分:5)

Swift 4.2、5.0

        if isArabic {
            UIView.appearance().semanticContentAttribute = .forceRightToLeft
            UIButton.appearance().semanticContentAttribute = .forceRightToLeft
            UITextView.appearance().semanticContentAttribute = .forceRightToLeft
            UITextField.appearance().semanticContentAttribute = .forceRightToLeft
        } else {
            UIView.appearance().semanticContentAttribute = .forceLeftToRight
            UIButton.appearance().semanticContentAttribute = .forceLeftToRight
            UITextView.appearance().semanticContentAttribute = .forceLeftToRight
            UITextField.appearance().semanticContentAttribute = .forceLeftToRight
        }

答案 1 :(得分:3)

解决此问题的另一种方法是将您的条件代码放入

override func viewWillLayoutSubviews() {
        if Language.language == .arabic {
            DispatchQueue.main.async {
                self.inputTextField.semanticContentAttribute = .forceRightToLeft
                self.inputTextField.textAlignment = .right
            }

        } else {
            DispatchQueue.main.async {
                self.inputTextField.semanticContentAttribute = .forceRightToLeft
                self.inputTextField.textAlignment = .left
            }
        }
    }

简单的工作;)

答案 2 :(得分:1)

  1. 第一步,您需要应用其他答案中提到的语义内容属性。

    // get current language using your 'Localize' class
    let locale = Localize.currentLanguage()
    UIView.appearance().semanticContentAttribute = locale == "ar" ? .forceRightToLeft : .forceLeftToRight
    

    但是,仅凭此一项是行不通的,因为基于Apple's Doc

      

    当视图进入窗口时,iOS会应用外观更改,它不会更改窗口中已有视图的外观。要更改当前在窗口中的视图的外观,请从视图层次结构中删除该视图,然后将其放回原处。

  2. 第二步是在文档本身中。您只需从视图层次结构中删除视图,然后放回去。

    let window = self.view.superview
    self.view.removeFromSuperview()
    window?.addSubview(self.view)
    

    注意:由于self.view已被实例化,您只需将其从视图层次结构中删除并放回去,就不必担心从头开始创建视图。:)

Voila!

答案 3 :(得分:0)

语义内容属性必须应用于更改语言时要翻转的视图的直接父级,因此对标志imageV的父视图和2个标签执行此操作

self.directParentView.semanticContentAttribute = .forceRightToLeft

答案 4 :(得分:0)

对于textFields-使用可以使用如下扩展名:

extension UITextField {
 open override func awakeFromNib() {
        super.awakeFromNib()
        if UserDefaults.languageCode == "ar" {
            if textAlignment == .natural {
                self.textAlignment = .right
            }
        }
    }
}