我试图在我的 iOS 5.x 应用程序中为原生键盘打开时提供不同的语言支持。请问有人可以指导我如何通过编程方式在原生键盘中添加该语言支持吗?我看到了 Carbon 框架,但是好像只适用于 Mac 应用程序。
谢谢。
谢谢。
从iOS 7开始,您可以根据每个UIResponder的基础来执行此操作。在UIResponder类中有一个名为textInputMode的属性。它是只读的,但文档中表示:
文本输入模式标识了当此响应者处于活动状态时显示的语言和键盘。
对于响应者,系统通常会显示基于用户语言偏好的键盘。您可以重新定义此属性,并在需要响应者使用特定键盘的情况下使用它来返回不同的文本输入模式。用户仍然可以在响应者处于活动状态时更改键盘,但切换到另一个响应者然后再切换回来会恢复您指定的键盘。
在我的项目中,我创建了一个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];
}
我在我的Utilities类中还有一个自定义的方法+(NSString *)langFromLocale:(NSString *)locale,它的样子是这样的:
+ (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];
}
现在我的自定义文本框类可以通过设置userDefinedKeyboardLanguage属性来简单地更改键盘输入语言为所需的语言。
现在我的自定义文本框类可以通过设置userDefinedKeyboardLanguage属性来简单地更改键盘输入语言为所需的语言。
我知道这是一个老问题,但这是我改变键盘语言的方法。
感谢 @the4kman 的提醒:这种方法只能将当前键盘更改为在设置中添加过的键盘。
Swift 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
}
}
UIKeyboardTypeASCIICapable
可以实现此功能。您可以通过按底部行上的“地球图标”直接在键盘上更改键盘。首先,您必须在设置中启用这些输入语言。然后按键盘上的地球按钮可以在这些语言之间切换。声明:
@IBOutlet var yourTextField:cTextField!;
使用:
yourTextField.languageCode = "ru";
类 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;
}
}
public extension UITextField {
override var textInputMode: UITextInputMode? {
return UITextInputMode.activeInputModes.filter { $0.primaryLanguage == "emoji" }.first ?? super.textInputMode
}
}
与其使用“emoji”,可以考虑使用Utils.currentAppLanguage
。
Swift 5 的实现:
public extension UITextField
{
// ⚠️ Prefer english keyboards
//
override var textInputMode: UITextInputMode?
{
let locale = Locale(identifier: "en_US") // your preferred locale
return
UITextInputMode.activeInputModes.first(where: { $0.primaryLanguage == locale.languageCode })
??
super.textInputMode
}
}
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"el", nil]
forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];