Как предотвратить изменение выравнивания UITextfield, когда язык ввода RTL / арабский? - PullRequest
0 голосов
/ 04 января 2019

Язык приложения английский, на иллюстрации слева показано, что содержимое UITextfield выровнено по левому краю. Это нормально, но когда пользователь выбирает язык ввода RTL / арабский, выравнивание полей автоматически переворачивается, как заставить выравнивание быть оставленным без учета направления языка ввода?

РЕДАКТИРОВАТЬ:

Я попробовал это, но проблема не решается

    let _beginningOfDocument = fieldPassword!.beginningOfDocument
    let _endOfDocument = fieldPassword!.endOfDocument

    fieldPassword!.setBaseWritingDirection(.leftToRight, for: fieldPassword!.textRange(from: _beginningOfDocument , to: _endOfDocument )! )

swift alignment for keyboards uitextfields rtl

Ответы [ 4 ]

0 голосов
/ 06 марта 2019

Если честно, я перепробовал все из них и у меня не работает, потому что это связано с иерархией представлений. Для получения дополнительной информации, вы можете прочитать это примечание

Примечание iOS применяет изменения внешнего вида, когда вид входит в окно, он не меняет внешний вид вида, который уже находится в окне. Чтобы изменить внешний вид представления, находящегося в данный момент в окне, удалите представление из иерархии представлений и затем верните его обратно.

Так что попробуйте это, у меня это сработало:

extension UITextField {
   open override func awakeFromNib() {
    super.awakeFromNib()
    if Utilities.getCurrentLanguage() == "ar" {
        if textAlignment == .natural {
            self.textAlignment = .right
        }
      }
   }
 }

Кстати, «Utilities.getCurrentLanguage ()» - это функция для получения текущего языка.

0 голосов
/ 05 января 2019

Выяснилось, что какая-то библиотека, которую я использовал, вызывала этот эффект, это библиотека MOLH, она использует метод swizzling, поэтому ее было трудно отлаживать ...

В ближайшее время я сделаю запрос на получение, чтобы сделать этот эффект необязательным ...

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

Спасибо.

0 голосов
/ 05 января 2019

In Swift 4

textField.semanticContentAttribute = UISemanticContentAttribute.forceLeftToRight
0 голосов
/ 04 января 2019

Добавьте в свой делегат приложения:

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

...