ネイティブキーボードを開くたびに、iOS 5.xアプリケーションで別の言語サポートを提供しようとしています。プログラムでこの言語をネイティブキーボードで提供します。誰かが私にそれをどのようにサポートできるかを教えてくれませんか?カーボンフレームワークを見ましたが、Macアプリのフレームワークのように見えます。
ありがとう。
いいえ、これは不可能です-ユーザーは設定で言語を変更することしかできません。
ただし、選択した場合(またはユーザーに好みを尋ねる場合)は、ユーザーに「英語」キーボードを提供できます。
これは次のようにして行います:UIKeyboardTypeASCIICapable
下段の「地球アイコン」を押すとキーボードから直接キーボードを変更できます。
まず、設定でこれらの言語を入力できるようにする必要があります。次に、キーボードの地球ボタンを押すと、それらの言語が切り替わります。
UIResponderごとにiOS 7から開始できます。 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プロパティを目的の言語に設定するだけで、キーボード入力言語を変更できます。
私はそれが古い質問であることを知っていますが、ここでキーボードの言語を変更する私の方法です。
マークの@ 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
}
}
宣言:
@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;
}
}
これは、たとえばギリシャ語のキーボードに変更すると機能するようです。
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"el", nil]
forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
すべての素晴らしい答え。しかし、Swiftでは、拡張機能で親クラス(UIResponder
)で定義されたメソッドと変数をオーバーライドできます。そのため、サブクラス化する必要はありません。そして、for
ループを追加Swiftワンライナーのように。
public extension UITextField {
override var textInputMode: UITextInputMode? {
return UITextInputMode.activeInputModes.filter { $0.primaryLanguage == "emoji" }.first ?? super.textInputMode
}
}
「絵文字」の代わりに、おそらくUtils.currentAppLanguage