iPhone:以编程方式更改键盘语言

Get*_*tsy 31 iphone iphone-softkeyboard

我打算在打开本机键盘时在iOS 5.x应用程序上提供不同的语言支持.以编程方式在本机键盘中提供此语言.有人可以指导我,我该如何支持它?我看到了碳框架,但看起来像Mac应用程序.

谢谢.

Dim*_*nko 44

你可以从每个UIR应答器的iOS 7开始.UIResponder类中有textInputMode属性.它是readonly,但文档说:

文本输入模式标识响应者处于活动状态时显示的语言和键盘.

对于响应者,系统通常显示基于用户语言首选项的键盘.您可以重新定义此属性,并在您希望响应者使用特定键盘的情况下使用它来返回不同的文本输入模式.用户仍然可以在响应者处于活动状态时更改键盘,但切换到另一个响应者然后返回还原您指定的键盘.

在我的项目中,我创建了一个子类,UITextField并定义了一个名为userDefinedKeyboardLanguage的新属性.我也覆盖了上面提到的textInputMode方法.它看起来类似于以下内容:

- (UITextInputMode *) textInputMode {
    for (UITextInputMode *tim in [UITextInputMode activeInputModes]) {
        if ([[Utilities langFromLocale:userDefinedKeyboardLanguage] isEqualToString:[Utilities langFromLocale:tim.primaryLanguage]]) return tim;
    }
    return [super textInputMode];
}
Run Code Online (Sandbox Code Playgroud)

我的Utilities类中还有一个自定义方法+(NSString*)langFromLocale:(NSString*)语言环境,如下所示:

+ (NSString *)langFromLocale:(NSString *)locale {
    NSRange r = [locale rangeOfString:@"_"];
    if (r.length == 0) r.location = locale.length;
    NSRange r2 = [locale rangeOfString:@"-"];
    if (r2.length == 0) r2.location = locale.length;
    return [[locale substringToIndex:MIN(r.location, r2.location)] lowercaseString];
}
Run Code Online (Sandbox Code Playgroud)

现在,我的自定义文本字段类可以通过将userDefinedKeyboardLanguage属性设置为所需的语言来更改键盘输入语言.

  • 大!这应该是答案. (3认同)
  • 如何在swift中删除textInputMode? (3认同)
  • 我的项目是在Swift中,但我发现我需要回到ObjC来覆盖textInputMode. (2认同)

kot*_*ska 33

我知道这是一个老问题,但这是我改变键盘语言的方法.

感谢@ the4kman的标记:这种方式只能将当前键盘更改为在"设置"中添加的键盘.

斯威夫特3:

class CustomTextField: UITextField {

    private func getKeyboardLanguage() -> String? {
        return "en" // here you can choose keyboard any way you need
    }

    override var textInputMode: UITextInputMode? {
        if let language = getKeyboardLanguage() {
            for tim in UITextInputMode.activeInputModes {
                if tim.primaryLanguage!.contains(language) {
                    return tim
                }
            }
        }
        return super.textInputMode
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 哇,我不认为这是可能的,但它确实有效.iOS 10,Xcode 8 swift 3 (3认同)
  • 请注意,这只能将键盘更改为用户在"设置"中添加的键盘. (2认同)
  • 从 iOS 13 开始,这不再有效(textInputMode 返回值被键盘忽略)。我认为您只能使用它来更改为英文键盘,而不能使用其他键盘。目前尚不清楚这是一个错误还是一个“新功能”。每个人都应该归档雷达。 (2认同)
  • @dbquarrel 我刚刚尝试过,它在 iOS 13.3 中不起作用,即使更改为英文键盘也是如此。 (2认同)

Les*_*win 7

斯威夫特 5 实现:

\n\n
public extension UITextField \n{ \n    // \xe2\x9a\xa0\xef\xb8\x8f Prefer english keyboards\n    //\n    override var textInputMode: UITextInputMode?\n    {\n        let locale = Locale(identifier: "en_US") // your preferred locale\n\n        return\n            UITextInputMode.activeInputModes.first(where: { $0.primaryLanguage == locale.languageCode })\n            ??\n            super.textInputMode\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n


Nim*_*ekh 6

不,这是不可能的 - 用户只能在设置中更改其语言.

但是,如果您选择(或询问他们的偏好),您可以为用户提供"英语"键盘

你这样做使用: UIKeyboardTypeASCIICapable

您可以通过按下底行的"地球图标"直接在键盘上更改键盘.

首先,您必须在"设置"中启用这些语言以进行输入.然后按键盘上的地球按钮将在这些语言之间切换.

  • 也许在 2012 年这是不可能的。现在通过覆盖 `textInputMode` 是可能的。见 kotvaska 答案。它甚至适用于 ios 11 :) (2认同)

Ден*_*пов 5

宣言:

@IBOutlet var yourTextField:cTextField!;
Run Code Online (Sandbox Code Playgroud)

用:

yourTextField.languageCode = "ru";
Run Code Online (Sandbox Code Playgroud)

cTextField 类:

class cTextField: UITextField {

    // ru, en, ....
    var languageCode:String?{
        didSet{
            if self.isFirstResponder{
                self.resignFirstResponder();
                self.becomeFirstResponder();
            }
        }
    }

    override var textInputMode: UITextInputMode?{
        if let language_code = self.languageCode{
            for keyboard in UITextInputMode.activeInputModes{
                if let language = keyboard.primaryLanguage{
                    let locale = Locale.init(identifier: language);
                    if locale.languageCode == language_code{
                        return keyboard;
                    }
                }
            }
        }
        return super.textInputMode;
    }
}
Run Code Online (Sandbox Code Playgroud)


Au *_*Ris 5

所有伟大的答案。但是在 Swift 中,您可以UIResponder在扩展中覆盖父类 ( ) 中定义的方法和变量。所以没有必要子类化。for用更快速的单线替换循环很好。

public extension UITextField {  
    override var textInputMode: UITextInputMode? {
        return UITextInputMode.activeInputModes.filter { $0.primaryLanguage == "emoji" }.first ?? super.textInputMode
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是“表情符号”可能会像 Utils.currentAppLanguage