web-dev-qa-db-fra.com

iOS 9 désactiver la prise en charge de la langue de droite à gauche

Mon application iOS est uniquement en langue arabe (de droite à gauche). Avant iOS 9, la disposition des vues et les animations des vues étaient toutes par défaut de gauche à droite. Donc, j'avais personnalisé l'application complète et inversé le comportement par défaut, par exemple le bouton de retour dans la barre de navigation a été défini pour être à droite au lieu de gauche par défaut.

Mais maintenant, lorsque l'application est compilée à l'aide du dernier SDK (Xcode 7 beta 4), tout est à l'opposé de ce dont j'ai besoin.

Existe-t-il un moyen simple de forcer l'application à afficher des vues et à se comporter comme iOS 8 et 7?

J'ai cherché et trouvé une solution mais cela implique de changer les contraintes (Décochez la case "Respecter la direction du langage") pour toutes les vues. Mais ce n'est pas une solution réalisable dans les grands projets.

Ceci est une capture d'écran après avoir compilé avec Xcode 7 beta 4. .

et ceci est une capture d'écran lorsqu'il est compilé avec Xcode 6. enter image description here

20
Abdullah Umer

Modifier: Le code suivant peut provoquer un comportement inattendu comme l'a souligné @wakachamo. Alors, faites attention aux problèmes, par exemple Le geste pop interactif ne fonctionne pas, les alertes ne s'affichent pas, etc. Il vaut mieux suivre les instructions fournies par @wakachamo si cela ne fonctionne pas pour vous

Ajoutez ceci au délégué de l'application méthode didFinishLaunchingWithOptions.

[[UIView appearance] setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight];

Ajoutez également une protection pour prendre en charge la version antérieure afin que la propriété ne provoque aucun crash.

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

[[UIView alloc] init] au lieu de [UIView apparence] car respondsToSelector ne fonctionne pas actuellement avec [UIView apparence] pour setSemanticContentAttribute. Vous pouvez également ajouter iOS 9 Check

#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

j'ai trouvé la bonne façon de Apple Forums des développeurs

ici iOS 9 beta - UIAlertController ne fonctionne pas

il suffit d'ajouter ce code pour que alertview fonctionne avec

 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

Je sais qu'il est trop tard pour répondre. Mais je l'ai compris (Seul le problème de la barre de navigation).

La réponse est adaptée de @Kamran Kan. Merci @Kamran.

Jus remplace le IView par INavigationBar dans la réponse de @ Kamran. alors le code sera le suivant.

#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];
}

Puisqu'il s'agit uniquement de l'effet UINavigationBar, les autres contrôles ne seront pas appliqués. L'UIAlertView fonctionne donc bien ...

11
Rishad Appat

Il n'y a pas de moyen facile. Il est recommandé de migrer vers l'API standard autant que possible à long terme.

Une autre approche consiste à définir semanticContentAttribute de toutes les vues affectées sur UISemanticContentAttributeForceLeftToRight, mais cela est tout aussi possible que de définir toutes vos contraintes pour utiliser Gauche/Droite au lieu de Interligne/Traîné. En plus de cela, vous devrez également passer ces appels autour d'un contrôle de disponibilité si vous ciblez iOS <9.

7
wakachamo

Swift 2 Code

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

Pour Swift

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

Utilisez Storyboard et choisissez pour chaque contrôleur de vue spécifique

Sémantique-> Force de gauche à droite.

Force Left-to-Right

3
Sedat Y