web-dev-qa-db-ja.com

プログラムによる右から左へのRTLへの変更

私は英語とアラビア語の2つの言語をサポートするアプリを開発しています。ユーザーが言語をアラビア語に変更した場合、アプリでテキストを右から左(RTL)にする必要があります。

この問題を検索したところ、RTLのサポートについて this answer が見つかりました。

上記の答えをプログラムで適用したいのですが、アプリの実行中にLTRからRTLに変更する必要があるためです。

13
SalmaGh

これを使用して、アプリを右から左の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にしました。

10
SalmaGh

in Swift 4これを試してください、

//FOR RIGHT TO LEFT
 UIView.appearance().semanticContentAttribute = .forceRightToLeft

//FOR LEFT TO RIGHT
 UIView.appearance().semanticContentAttribute = .forceLeftToRight
19
Jaydip

このコード行を使用すると、アプリケーションを閉じずにレイアウトが変更されます。右から左へ

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
            }
        }
    }
}
5

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を呼び出して、再読み込みフローを作成します。

2
Muhammad Asyraf

これは独自のアプリケーションであるため、UI要素を制御できると想定します。

その場合、要件を満たすNSLayoutConstraintを提供できるだけでなく、テキストとボタンの表示の配置を指定することもできます:NSTextAlignment

システム設定をプログラムで制御することはできないため、アプリはleadingtrailingなどの自然な制約を利用しなくなることに注意してください。

1
SwiftArchitect

Swiftのアラビア語レイアウトが必要な場合は、メソッドdidFinishLaunchingWithOptionsで以下の行を使用します。

UIView.appearance()。semanticContentAttribute = .forceRightToLeft

目的C

[UIViewの外観] .semanticContentAttribute = UISemanticContentAttributeForceRightToLeft;

を使用してアプリをリロードします

[self application:app didFinishLaunchingWithOptions:nil];

appDelegateの他のメソッドで。アプリの言語を変更する場所でそのメソッドを呼び出します。

アプリの英語ローカライズにはその逆も使用できます。

1
IOSPercy

なぜこれが必要なのかと聞いてもよろしいですか。

これを行う前に2度考えることを強くお勧めします。これは、混乱を招くユーザーエクスペリエンスを提供するためです。ユーザーはアプリがシステム言語に従うことを期待しているため、アプリ内で言語を選択する方法はありません。

iOSでは、正しい方法で簡単に実行できます。自動レイアウトを使用し、UIKit APIでカスタムコントロールを作成し、NSLocalizedStringを使用すると、実行時にすべてがユーザーの適切な処理を行います。

0
wakachamo

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)

これが他の人が簡単にビューをめくるのに役立つことを願っています。

0
Muhammad Asyraf