You can do it starting from iOS 7 on a per UIResponder basis.
There is textInputMode property in UIResponder class. It is readonly, but the documentation says:
The text input mode identifies the language and keyboard displayed
when this responder is active.
For responders, the system normally displays a keyboard that is based
on the user’s language preferences. You can redefine this property and
use it to return a different text input mode in cases where you want a
responder to use a specific keyboard. The user can still change the
keyboard while the responder is active, but switching away to another
responder and then back restores the keyboard you specified.
In my project I created a subclass of UITextField
and defined a new property called userDefinedKeyboardLanguage. I also overrode above mentioned textInputMode method. It looks similar to the following:
- (UITextInputMode *) textInputMode {
for (UITextInputMode *tim in [UITextInputMode activeInputModes]) {
if ([[Utilities langFromLocale:userDefinedKeyboardLanguage] isEqualToString:[Utilities langFromLocale:tim.primaryLanguage]]) return tim;
}
return [super textInputMode];
}
I have also a custom method +(NSString *)langFromLocale:(NSString *)locale in my Utilities class which looks like this:
+ (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];
}
Now my custom textfield class can change the keyboard input language simply by setting userDefinedKeyboardLanguage property to the desired language.