web-dev-qa-db-fra.com

Passer de droite à gauche RTL par programme

Je travaille sur une application qui prend en charge deux langues: anglais et arabe. Lorsque l'utilisateur change la langue en arabe, j'ai besoin de mon application pour faire le texte de droite à gauche (RTL).

J'ai recherché ce problème et j'ai trouvé cette réponse sur la prise en charge de RTL.

Je voudrais appliquer la réponse ci-dessus mais de manière programmatique, car je dois passer de LTR à RTL pendant que l'application est en cours d'exécution.

13
SalmaGh

J'ai changé mon application de droite à gauche RTL en utilisant ceci:

self.transform = CGAffineTransformMakeScale(-1.0, 1.0)

Cela a inversé la vue, puis j'ai inversé les objets dans la vue comme ceci:

label.transform = CGAffineTransformMakeScale(-1.0, 1.0)
textField.transform = CGAffineTransformMakeScale(-1.0, 1.0)
image.transform = CGAffineTransformMakeScale(-1.0, 1.0)

Cela a rendu mes vues RTL au lieu de modifier toutes les contraintes ou de reconstruire l'application en RTL.

10
SalmaGh

in Swift 4 essayez ceci,

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

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

Utilisez cette ligne de code pour changer la disposition sans fermer l'application. De droite à gauche

UIView.appearance().semanticContentAttribute = .forceRightToLeft

Et pour un basculement de gauche à droite

UIView.appearance().semanticContentAttribute = .forceLeftToRight

et si vous voulez changer la disposition du champ de texte ou le changement de texte, utilisez ce code car j'ai rencontré ce problème. Les textes de textfield ne changeaient pas la disposition. vérifiez ce code pour changer la disposition du texte du champ de texte

extension UITextField {
open override func awakeFromNib() {
        super.awakeFromNib()
        if UserDefaults.languageCode == "ar" {
            if textAlignment == .natural {
                self.textAlignment = .right
            }
        }
    }
}
5
Shahzaib Maqbool

03/05/2018: Puisque @SalmaGh a répondu à sa propre question.
Mais la solution ferait mal gâcher votre interface utilisateur/UX.
Je donnerais une suggestion sur la façon dont je résoudrais ce problème.

Cette réponse était se référer à une réponse multiple qui mériterait d'être surévalué au lieu de diminuer.

Raison: l'ajout d'un sélecteur de langue à votre application ne fera que le rendre plus déroutant

Cette solution est requise car certains langue arabe tels que la mention par @ Afshin M. Khiabani sont effectués manuellement dans l'application au lieu de Library/Framework/Device Default. cela donne au développeur plus de contrôle sur leurs applications. cependant, cette méthode n'est pas préférable.

AVERTISSEMENT: Cela gâchera Horizantal Scrollview avec des sous-vues

Mais si vous devez forcer la vue LTL à être RTL. suggérer d'utiliser IOSPercy et Jaydip réponse. mais veuillez faire un signalement pour vérification. tel que let isArabic = false ou utilisé par défaut de l'utilisateur.


Entrez d'abord le code dans AppDelegate didFinishLaunchingWithOptions
pourquoi devrions-nous mettre cette vérification dans l'AppDelegate parce que UIView sur AppDelegate serait le superview à tout contrôleur de vue.

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

Ce code chargera automatiquement les applications en mode RTL si Applanguage enregistre "ar" mais cela ne se produira qu'une seule fois lorsque vous rouvrirez les applications.


Mais vous pouvez accéder à la fonction en appelant la fonction AppDelegate comme ceci:

        let appDelegate: AppDelegate? = UIApplication.shared.delegate as? AppDelegate
        appDelegate?.ChangeLayout()


Appelez ensuite TopMost ViewController tel que LoadingScreen ou quelque chose pour effectuer le rechargement.

2
Muhammad Asyraf

Comme il s'agit de votre propre application, je vais supposer que vous contrôlez ses éléments d'interface utilisateur.

Si tel est le cas, non seulement vous pouvez fournir NSLayoutConstraint qui satisfont à vos besoins, mais vous pouvez également spécifier l'alignement pour la représentation du texte et des boutons: NSTextAlignment.

Étant donné que vous ne pouvez pas contrôler les paramètres système par programmation, gardez à l'esprit que votre application ne tirera plus parti des contraintes naturelles, telles que leading ou trailing.

1
SwiftArchitect

Utilisez les lignes suivantes dans la méthode didFinishLaunchingWithOptions lorsque vous voulez une disposition en langue arabe, pour Swift

UIView.appearance (). SemanticContentAttribute = .forceRightToLeft

Pour l'objectif C

[Apparence UIView] .semanticContentAttribute = UISemanticContentAttributeForceRightToLeft;

et rechargez l'application en utilisant

[self application:app didFinishLaunchingWithOptions:nil];

dans une autre méthode dans appDelegate. Appelez cette méthode où vous changez la langue de l'application.

Utilisez l'inverse pour la localisation en anglais de l'application.

1
IOSPercy

Cela vous dérange si je vous demande pourquoi vous en avez besoin?

Je recommande fortement de réfléchir à deux fois avant de faire cela, principalement parce que cela offre une expérience utilisateur déroutante. Les utilisateurs s'attendent à ce que leurs applications suivent la langue du système et n'ont donc aucune méthode pour choisir la langue dans l'application.

iOS, il est très facile pour vous de le faire de la bonne façon; si vous utilisez la disposition automatique, créez vos contrôles personnalisés sur l'API UIKit et utilisez NSLocalizedString, tout fera la bonne chose au moment de l'exécution pour vos utilisateurs.

0
wakachamo

Solution d'extension pour retourner UIView et UILabel

Extension UIViews
Il peut fonctionner avec n'importe quoi tant qu'il s'agit d'une vue.

extension UIView{
   func flipView(){
       self.transform = CGAffineTransform(scaleX: -1.0, y: 1.0)
   }
}

tilisé comme tel *

Cela inversera les vues et l'élément à l'intérieur de cette vue.

UIView.flipView()



Extension d'étiquette d'interface utilisateur
J'ai créé une extension distincte pour UILabel car elle est liée à l'alignement du texte

extension UILabel{
    func flipLabel(align: NSTextAlignment){
        self.textAlignment = align
        self.transform = CGAffineTransform(scaleX: -1.0, y: 1.0)
    }
}

tilisé comme ça sur UILabel

 UILabel.flipLabel(align: .right)

J'espère que cela aidera les autres à changer de vue plus facilement.

0
Muhammad Asyraf