私のiOSアプリはアラビア語(右から左)言語のみです。 iOS 9より前は、ビューのレイアウトとビューのアニメーションはすべてデフォルトで左から右でした。そのため、アプリ全体をカスタマイズし、デフォルトの動作を逆にしました。ナビゲーションバーの戻るボタンがデフォルトの左側ではなく右側に設定されました。
しかし、アプリが最新のSDK(Xcode 7ベータ4)を使用してコンパイルされると、すべてが私が必要としているものとは逆になります。
アプリに強制的にビューを表示させ、iOS 8および7のように動作させる簡単な方法はありますか?
検索して解決策を見つけましたが、すべてのビューの制約を変更する必要があります(「言語の方向を尊重する」のチェックを外します)。しかし、これは大規模なプロジェクトでは実行可能なソリューションではありません。
編集:@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];
}
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];
}
私は答えるのが遅すぎることを知っています。しかし、私はそれを理解しました(ナビゲーションバーの問題のみ)。
回答は@Kamran Kanに基づいています。@ Kamranに感謝します。
Jusは、@ Kamranの回答でIViewをINavigationBarに置き換えます。コードは次のようになります。
#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は正常に動作しています...
簡単な方法はありません。標準APIにできるだけ長期間移行することをお勧めします。
別の方法は、影響を受けるすべてのビューのsemanticContentAttribute
をUISemanticContentAttributeForceLeftToRight
に設定することですが、これはすべての制約を設定して、先頭/末尾の代わりに左/右を使用するのと同じように実行できます。これに加えて、iOS <9を対象とする場合は、これらの呼び出しを利用可能性チェックの周りでゲートする必要があります。
Swift 2コード
if #available(iOS 9.0, *) {
myView.semanticContentAttribute = .ForceLeftToRight
}
Swiftの場合
if #available(iOS 10.0, *) {
UIView.appearance().semanticContentAttribute = .forceLeftToRight
}