私は英語とアラビア語の2つの言語をサポートするアプリを開発しています。ユーザーが言語をアラビア語に変更した場合、アプリでテキストを右から左(RTL)にする必要があります。
この問題を検索したところ、RTLのサポートについて this answer が見つかりました。
上記の答えをプログラムで適用したいのですが、アプリの実行中にLTRからRTLに変更する必要があるためです。
これを使用して、アプリを右から左のRTLに変更しました。
self.transform = CGAffineTransformMakeScale(-1.0, 1.0)
これでビューが反転し、次にビューのオブジェクトを次のように反転しました。
label.transform = CGAffineTransformMakeScale(-1.0, 1.0)
textField.transform = CGAffineTransformMakeScale(-1.0, 1.0)
image.transform = CGAffineTransformMakeScale(-1.0, 1.0)
これにより、すべての制約を変更したり、アプリをRTLとして再構築したりする代わりに、ビューをRTLにしました。
in Swift 4これを試してください、
//FOR RIGHT TO LEFT
UIView.appearance().semanticContentAttribute = .forceRightToLeft
//FOR LEFT TO RIGHT
UIView.appearance().semanticContentAttribute = .forceLeftToRight
このコード行を使用すると、アプリケーションを閉じずにレイアウトが変更されます。右から左へ
UIView.appearance().semanticContentAttribute = .forceRightToLeft
そして、左から右へのフリップ
UIView.appearance().semanticContentAttribute = .forceLeftToRight
テキストフィールドのレイアウトやテキストの変更を変更する場合は、この問題に直面したため、このコードを使用します。テキストフィールドのテキストはレイアウトを変更していませんでした。このコードをチェックして、テキストフィールドテキストのレイアウトを変更します
extension UITextField {
open override func awakeFromNib() {
super.awakeFromNib()
if UserDefaults.languageCode == "ar" {
if textAlignment == .natural {
self.textAlignment = .right
}
}
}
}
03/05/2018:@ SalmaGhが自分の所有する質問に回答しているため
しかし、このソリューションでは、UI/UXがめちゃくちゃになってしまいます。
この問題を解決する方法を提案します。
この回答は複数の回答から参照だれが賛成に値する反対票ではなくでした。
理由:アプリに言語スイッチャーを追加しても、混乱が生じるだけです
@ Afshin M. Khiabaniによる言及などアラビア語の一部は、ライブラリ/フレームワーク/デバイスのデフォルトではなく、手動でアプリで実行されるため、このソリューションが必要です。これにより、開発者はアプリをより詳細に制御できます。ただし、この方法は優先されません。
警告:これは、サブビューを含む水平スクロールビューを台無しにします
ただし、必要な場合 LTLビューをRTLに強制します。 IOSPercyおよびJaydipを使用することをお勧めします。ただし、チェックのためにフラグを立ててください。といった let isArabic = false
または使用ユーザーのデフォルト。
最初にAppDelegate内にコードを入力didFinishLaunchingWithOptions
このチェックをAppDelegateに配置する理由は、AppDelegateのUIViewがすべてのView Controllerのスーパービューになるためです。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
self.ChangeLayout()
return true
}
func ChangeLayout(){
var languageCode = ""
if let value = UserDefaults.standard.string(forKey: "Applanguage") {
languageCode = value
}else{
languageCode = ""
}
if(languageCode == "ar"){
UIView.appearance().semanticContentAttribute = .forceRightToLeft
}else{
UIView.appearance().semanticContentAttribute = .forceLeftToRight
}
}
Applanguage save "ar"の場合、このコードはアプリをRTLモードで自動的にロードしますが、これはアプリを再度開いたときに1回だけ発生します。
しかし、AppDelegate関数を呼び出すことで関数にアクセスできます。
let appDelegate: AppDelegate? = UIApplication.shared.delegate as? AppDelegate
appDelegate?.ChangeLayout()
次に、LoadingScreenなどのTopMost ViewControllerを呼び出して、再読み込みフローを作成します。
これは独自のアプリケーションであるため、UI要素を制御できると想定します。
その場合、要件を満たすNSLayoutConstraint
を提供できるだけでなく、テキストとボタンの表示の配置を指定することもできます:NSTextAlignment
。
システム設定をプログラムで制御することはできないため、アプリはleading
やtrailing
などの自然な制約を利用しなくなることに注意してください。
Swiftのアラビア語レイアウトが必要な場合は、メソッドdidFinishLaunchingWithOptionsで以下の行を使用します。
UIView.appearance()。semanticContentAttribute = .forceRightToLeft
目的C
[UIViewの外観] .semanticContentAttribute = UISemanticContentAttributeForceRightToLeft;
を使用してアプリをリロードします
[self application:app didFinishLaunchingWithOptions:nil];
appDelegateの他のメソッドで。アプリの言語を変更する場所でそのメソッドを呼び出します。
アプリの英語ローカライズにはその逆も使用できます。
なぜこれが必要なのかと聞いてもよろしいですか。
これを行う前に2度考えることを強くお勧めします。これは、混乱を招くユーザーエクスペリエンスを提供するためです。ユーザーはアプリがシステム言語に従うことを期待しているため、アプリ内で言語を選択する方法はありません。
iOSでは、正しい方法で簡単に実行できます。自動レイアウトを使用し、UIKit APIでカスタムコントロールを作成し、NSLocalizedStringを使用すると、実行時にすべてがユーザーの適切な処理を行います。
IViewとUILabelをフリップする拡張ソリューション
IViews Extension
ビューであれば、何でも機能します。
extension UIView{
func flipView(){
self.transform = CGAffineTransform(scaleX: -1.0, y: 1.0)
}
}
そのように使用 *
これにより、ビュー内のビューとアイテムが反転します。
UIView.flipView()
Iラベル拡張子
UILabelはテキストの配置に関連しているため、別の拡張を作成しました
extension UILabel{
func flipLabel(align: NSTextAlignment){
self.textAlignment = align
self.transform = CGAffineTransform(scaleX: -1.0, y: 1.0)
}
}
ILabelで使用
UILabel.flipLabel(align: .right)
これが他の人が簡単にビューをめくるのに役立つことを願っています。