El idioma de la aplicación es inglés, la ilustración de la izquierda muestra el contenido de UITextfield alineado a la izquierda... lo cual es normal, pero cuando el usuario selecciona un idioma de entrada RTL/árabe, la alineación de los campos se voltea automáticamente, cómo forzar la alineación a quedar sin tener en cuenta la dirección del idioma de entrada?
EDITAR :
Intenté esto, y no está resolviendo el problema.
let _beginningOfDocument = fieldPassword!.beginningOfDocument let _endOfDocument = fieldPassword!.endOfDocument fieldPassword!.setBaseWritingDirection(.leftToRight, for: fieldPassword!.textRange(from: _beginningOfDocument , to: _endOfDocument )! )Para ser honesto, los probé todos y no me funciona porque está relacionado con la jerarquía de vistas. Para más información, puedes leer esta nota
Tenga en cuenta que iOS aplica cambios de apariencia cuando una vista ingresa a una ventana, no cambia la apariencia de una vista que ya está en una ventana. Para cambiar la apariencia de una vista que se encuentra actualmente en una ventana, elimine la vista de la jerarquía de vistas y luego vuelva a colocarla.
Así que prueba este, funcionó para mí:
extension UITextField { open override func awakeFromNib() { super.awakeFromNib() if Utilities.getCurrentLanguage() == "ar" { if textAlignment == .natural { self.textAlignment = .right } } } }Por cierto, "Utilities.getCurrentLanguage()" es una función para obtener el idioma actual.
Resultó que alguna biblioteca que estaba usando causó este efecto, es la biblioteca MOLH, usa el método swizzling, es por eso que esto fue difícil de depurar...
Pronto haré una solicitud de incorporación de cambios para que este efecto sea opcional...
func listenToKeyboard() { NotificationCenter.default.removeObserver(self, name: UITextInputMode.currentInputModeDidChangeNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(inputModeDidChange), name: UITextInputMode.currentInputModeDidChangeNotification, object: nil) } @objc func inputModeDidChange(_ notification: Notification) { if let language = self.textInputMode?.primaryLanguage, MOLHLanguage.isRTLLanguage(language: language) { self.textAlignment = .right } else { self.textAlignment = .left } }Gracias.
en rápido 4
textField.semanticContentAttribute = UISemanticContentAttribute.forceLeftToRight