在我的应用中有三种语言,即 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。
必填项:
修改
如果我在视图中获取所有内容,那么它按预期工作,但natural text alignment和导航栏仍未受影响。
如果存在复杂的布局,则无法翻转每个视图,因为它可能会降低应用程序性能。
所以我尝试self.view.semanticContentAttribute = .forceRightToLeft
并没有任何区别。
我的每个UI组件都有前导不是左右,并且还选择了尊重语言方向。
答案 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)
第一步,您需要应用其他答案中提到的语义内容属性。
// get current language using your 'Localize' class
let locale = Localize.currentLanguage()
UIView.appearance().semanticContentAttribute = locale == "ar" ? .forceRightToLeft : .forceLeftToRight
但是,仅凭此一项是行不通的,因为基于Apple's Doc:
当视图进入窗口时,iOS会应用外观更改,它不会更改窗口中已有视图的外观。要更改当前在窗口中的视图的外观,请从视图层次结构中删除该视图,然后将其放回原处。
第二步是在文档本身中。您只需从视图层次结构中删除视图,然后放回去。
let window = self.view.superview
self.view.removeFromSuperview()
window?.addSubview(self.view)
注意:由于self.view
已被实例化,您只需将其从视图层次结构中删除并放回去,就不必担心从头开始创建视图。:)
答案 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
}
}
}
}