web-dev-qa-db-ja.com

iOS 9で右から左への言語のサポートを無効にする

私のiOSアプリはアラビア語(右から左)言語のみです。 iOS 9より前は、ビューのレイアウトとビューのアニメーションはすべてデフォルトで左から右でした。そのため、アプリ全体をカスタマイズし、デフォルトの動作を逆にしました。ナビゲーションバーの戻るボタンがデフォルトの左側ではなく右側に設定されました。

しかし、アプリが最新のSDK(Xcode 7ベータ4)を使用してコンパイルされると、すべてが私が必要としているものとは逆になります。

アプリに強制的にビューを表示させ、iOS 8および7のように動作させる簡単な方法はありますか?

検索して解決策を見つけましたが、すべてのビューの制約を変更する必要があります(「言語の方向を尊重する」のチェックを外します)。しかし、これは大規模なプロジェクトでは実行可能なソリューションではありません。

これはXcode 7ベータ4でコンパイルした後のスクリーンショットです .

これはXcode 6でコンパイルしたときのスクリーンショットです enter image description here

20
Abdullah Umer

編集:@wakachamoが指摘したように、次のコードは予期しない動作を引き起こす可能性があります。そのため、問題などに注意してください。インタラクティブなポップジェスチャーが機能しない、アラートビューが表示されない、など。これが機能しない場合は、@ wakachamoの指示に従うことをお勧めします。

これをアプリデリゲートdidFinishLaunchingWithOptionsメソッドに追加します。

[[UIView appearance] setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight];

また、プロパティがクラッシュしないように、以前のバージョンをサポートするようにガードを追加します。

if([[[UIView alloc] init] respondsToSelector:@selector(setSemanticContentAttribute:)]) {
        [[UIView appearance] setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight];
    }

[UIViewの外観]ではなく[[UIView alloc] init]。respondsToSelectorは現在、setSemanticContentAttributeの[UIViewの外観]と連携していないためです。 iOS 9チェックを追加することもできます

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")) {
        [[UIView appearance] setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight];
    }
22
Kamran Khan

Apple開発者フォーラムから正しい方法を見つけました

ここ iOS 9ベータ-UIAlertControllerが機能していません

このコードを追加するだけで、alertviewが機能します

 if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")) {
            [[UIView appearance] setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight];

    [[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setSemanticContentAttribute:UISemanticContentAttributeUnspecified];
    [[UIView appearanceWhenContainedIn:[UIAlertView class], nil] setSemanticContentAttribute:UISemanticContentAttributeUnspecified];



}
16
iDevSmart

私は答えるのが遅すぎることを知っています。しかし、私はそれを理解しました(ナビゲーションバーの問題のみ)。

回答は@Kamran Kanに基づいています。@ Kamranに感謝します。

Jusは、@ Kamranの回答でIViewINavigationBarに置き換えます。コードは次のようになります。

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")) {
    [[UINavigationBar appearance] setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight];
}

これはUINavigationBarにのみ影響するため、他のコントロールは影響しません。したがって、UIAlertViewは正常に動作しています...

11
Rishad Appat

簡単な方法はありません。標準APIにできるだけ長期間移行することをお勧めします。

別の方法は、影響を受けるすべてのビューのsemanticContentAttributeUISemanticContentAttributeForceLeftToRightに設定することですが、これはすべての制約を設定して、先頭/末尾の代わりに左/右を使用するのと同じように実行できます。これに加えて、iOS <9を対象とする場合は、これらの呼び出しを利用可能性チェックの周りでゲートする必要があります。

7
wakachamo

Swift 2コード

if #available(iOS 9.0, *) {
     myView.semanticContentAttribute = .ForceLeftToRight
}
5
Husam

Swiftの場合

if #available(iOS 10.0, *) {
     UIView.appearance().semanticContentAttribute = .forceLeftToRight
}
4

ストーリーボードを使用して、特定のビューコントローラーごとに選択する

セマンティック->左から右に強制。

Force Left-to-Right

3
Sedat Y