How can I add support for Chinese keyboard with UITextView on iOS 7?
Asked Answered
F

1

0

How can I add support for Chinese keyboard with UITextView on iOS 7? Currently I'm using the following code. But it works correctly only for standard-sized keyboards. It resizes UITextView only for the main keyboard without additional Chinese panel.

bool keyboardIsShown;
float keyboardDelta;

- (void)keyboardWillShow:(NSNotification*)aNotification {
    if (!keyboardIsShown) {
        keyboardIsShown = true;
        NSDictionary* userInfo = [aNotification userInfo];
        CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
        if (is_Landscape) {
            keyboardSize = CGSizeMake(keyboardSize.height, keyboardSize.width);
        }
        keyboardSize.height -= tabBarController.tabBar.frame.size.height;
        CGRect viewFrame = myUITextView.frame;
        keyboardDelta = keyboardSize.height;
        viewFrame.size.height -= keyboardDelta;

        NSTimeInterval animationDuration;
        UIViewAnimationCurve animationCurve;
        [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
        [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationCurve:animationCurve];
        [UIView setAnimationDuration:animationDuration];
        [myUITextView setFrame:viewFrame];
        [UIView commitAnimations];
    }
}

- (void)keyboardWillHide:(NSNotification*)aNotification {
    keyboardIsShown = false;
    CGRect viewFrame = editor.frame;
    viewFrame.size.height += keyboardDelta;

    NSDictionary* userInfo = [aNotification userInfo];
    NSTimeInterval animationDuration;
    UIViewAnimationCurve animationCurve;
    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationCurve:animationCurve];
    [UIView setAnimationDuration:animationDuration];
    [myUITextView setFrame:viewFrame];
    [UIView commitAnimations];
}
Foreignism answered 28/6, 2014 at 13:34 Comment(6)
The following approach doesn't help: #8541303 (it's about another issue).Foreignism
You'll have to be more specific as to what your question is. You don't need to do anything to support any keyboard, this is automatic. What your code does is resize your UITextView based on the size of the keyboard, and as there isn't anything hardcoded anywhere, I don't (yet) see why it would not work for all keyboard sizes? What exactly is the problem? I think screenshots would help.Darby
It resizes UITextView only for the main keyboard without additional Chinese panel.Foreignism
You'll need to tell us which Chinese keyboard, and show us a screenshot, because I've tried many Chinese keyboards, and I don't see one with a main keyboard and and additional panel?Darby
jcaron, you should type something to see additional panel. It's basic iOS functionality for Chinese users.Foreignism
Sorry, I'm not Chinese, and there are 9 different Chinese keyboards, so it took me a while to find what you are talking about. Now seen it. My best guess (haven't tested) is that iOS will send a new keyboardWillShow notification when that bit is added, which breaks in your code because of the if (!keyboardIsShown) test. You probably need to handle the case where the keyboard is already shown and you receive the notification again. A quick log or breakpoint in that method will confirm this.Darby
F
0

Thanks to jcaron. The correct code:

bool keyboardIsShown;
float editorHeight;

- (void)keyboardWillShow:(NSNotification*)aNotification {
    NSDictionary* userInfo = [aNotification userInfo];
    CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
    if (is_Landscape) {
        keyboardSize = CGSizeMake(keyboardSize.height, keyboardSize.width);
    }
    keyboardSize.height -= tabBarController.tabBar.frame.size.height;
    CGRect viewFrame = editor.frame;
    if (!keyboardIsShown) {
        editorHeight = viewFrame.size.height;
    }
    viewFrame.size.height = editorHeight - keyboardSize.height;
    keyboardIsShown = true;

    NSTimeInterval animationDuration;
    UIViewAnimationCurve animationCurve;
    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationCurve:animationCurve];
    [UIView setAnimationDuration:animationDuration];
    [editor setFrame:viewFrame];
    [UIView commitAnimations];
}

- (void)keyboardWillHide:(NSNotification*)aNotification {
    keyboardIsShown = false;
    CGRect viewFrame = editor.frame;
    viewFrame.size.height = editorHeight;

    NSDictionary* userInfo = [aNotification userInfo];
    NSTimeInterval animationDuration;
    UIViewAnimationCurve animationCurve;
    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationCurve:animationCurve];
    [UIView setAnimationDuration:animationDuration];
    [editor setFrame:viewFrame];
    [UIView commitAnimations];
}
Foreignism answered 28/6, 2014 at 15:3 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.