博客文章

Cocos2d-x v3版本 CCEAGLView:setMarkedText 使用系统输入法无法输入中文(包括带候选词的日文等等)

作者: andy.      时间: 2020-01-13 22:06:18

        上次更新版本前遇到一个问题,在IOS 13上面,使用系统输入法输入中文(带候选词的语言都会,下同),无法完成输入。因为发版本前一天发现的,来不及修复,同样因为发的海外,所以就没着急修复,等这次发版本(整包更新,非热更)才修复。感觉这个问题挺有意思的,所以记录下来。先说修改方法,这个有多种修改方法,这里说一种,这种是ccui.TextField can't input multistage text (like chinese) in ios 13 beta7(1)提到的,这个参考了CCEAGLView:setMarkedText problem in iOS13(2)这个里面的方法。选了1,没有选2的原因是因为2中UIGestureRecognizer移除了,但是移除后下次又会创建,反复的话对性能还是有一定影响,所以选用了第二种方法。具体修改如下:

        1、先修改CCEAGLView-ios.mm里面的两个方法textInRange和markedTextRange,修改为:

- (NSString *)textInRange:(UITextRange *)range
{
    CCLOG("textInRange");
    if (nil != markedText_) {
        return markedText_;
    }
    return @"";
}

- (UITextRange *)markedTextRange
{
    CCLOG("markedTextRange");
    if (nil != markedText_) {
        return [[[UITextRange alloc] init] autorelease];
    }
    return nil; // Nil if no marked text.
}

        2、重写gestureRecognizerShouldBegin方法,直接方法NO:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer API_AVAILABLE(ios(6.0)) {
    gestureRecognizer.delaysTouchesBegan = NO;
    gestureRecognizer.delaysTouchesEnded = NO;
    return NO;
}

        3、最后将所有的手势的Delay都改为NO:

    for (UIGestureRecognizer * gesture in [self gestureRecognizers])
    {
        gesture.delaysTouchesBegan = NO;
        gesture.delaysTouchesEnded = NO;
    }

        这个方案的原因在上面的的连接里面,wulv1985已经描述了。

        这里有个有意思的地方:

        重写方法的时候,我开始没有加API_AVAILABLE(ios(6.0)),没有调用,把我郁闷惨了,想了好久没想通。也是Objective-C开发的功底不够。