【已解决】cocos2d-x 3.2中KeyboardMove在iOS8下异常

先上图:

说明: editbox在点击输入框的时候, KeyboardMove往X方向移动了(正常情况是Y方向移动)
环境: xcode 6.0.1 & cocos2d-x 3.2 & iOS 8.0
项目: cocos2d_test.xcodeproj
补充: 同样的环境与代码在iOS 7.x上KeyboardMove是正确的;
在CCEAGLView doAnimationWhenKeyboardMoveWithDuration中的statusBarOrientation判断也是正确;
不知道这是不是iOS 8的bug; 求大神指点~~

话说… 论坛大神们呢… help… sos…

是啊,可以确定的是,在ios 7以下都表现正常,到了ios 8就是方向错误

我是cocos2d-x2.1.2,Xcode 6,ios8,也是遇到你这个问题了,改了一下EAGLView.mm这两个函数,横屏下试了好像输入法的时候暂时没问题了,算是临时解决一下

  • (void)onUIKeyboardNotification:(NSNotification *)notif;
    {
    NSString * type = notif.name;

    NSDictionary* info = ;
    CGRect begin = [self convertRect:
    CGRectValue]
    fromView:self];
    CGRect end = [self convertRect:
    CGRectValue]
    fromView:self];

    CGSize viewSize = self.frame.size;
    // CCLOG(“1-viewSize.width = %f”, viewSize.width);
    // CCLOG(“1-viewSize.height = %f”, viewSize.height);

    CGFloat tmp;
    float vision = systemVersion] floatValue];

// CCLOG(“系统版本 = %f”, vision);
//
if ( vision >= 8.0)
{
if( statusBarOrientation] == UIInterfaceOrientationLandscapeLeft
|| statusBarOrientation] == UIInterfaceOrientationLandscapeRight)
{
tmp = begin.size.width;
begin.size.width = begin.size.height;
begin.size.height = tmp;

        tmp = end.size.width;
        end.size.width = end.size.height;
        end.size.height = tmp;
    
        tmp = viewSize.width;
        viewSize.width = viewSize.height;
        viewSize.height = tmp;
    
        tmp = begin.origin.x;
        begin.origin.x = begin.origin.y;
        begin.origin.y = viewSize.height - tmp - begin.size.height;
    
        tmp = end.origin.x;
        end.origin.x = end.origin.y;
        end.origin.y = viewSize.height - tmp - end.size.height;
    }
}

double aniDuration =  doubleValue];



switch ( statusBarOrientation])
{
    case UIInterfaceOrientationPortrait:
        begin.origin.y = viewSize.height - begin.origin.y - begin.size.height;
        end.origin.y = viewSize.height - end.origin.y - end.size.height;
        break;
        
    case UIInterfaceOrientationPortraitUpsideDown:
        begin.origin.x = viewSize.width - begin.origin.x - begin.size.width;
        end.origin.x = viewSize.width - end.origin.x - end.size.width;
        break;
        
    case UIInterfaceOrientationLandscapeLeft:
        tmp = begin.size.width;
        begin.size.width = begin.size.height;
        begin.size.height = tmp;
        
        tmp = end.size.width;
        end.size.width = end.size.height;
        end.size.height = tmp;
        
        tmp = viewSize.width;
        viewSize.width = viewSize.height;
        viewSize.height = tmp;
        
        tmp = begin.origin.x;
        begin.origin.x = begin.origin.y;
        begin.origin.y = viewSize.height - tmp - begin.size.height;
        
        tmp = end.origin.x;
        end.origin.x = end.origin.y;
        end.origin.y = viewSize.height - tmp - end.size.height;
        break;
        
    case UIInterfaceOrientationLandscapeRight:
         if ( vision < 8.0)
        {
            tmp = begin.size.width;
            begin.size.width = begin.size.height;
            begin.size.height = tmp;
            
            tmp = end.size.width;
            end.size.width = end.size.height;
            end.size.height = tmp;
            
            tmp = viewSize.width;
            viewSize.width = viewSize.height;
            viewSize.height = tmp;
            
            tmp = begin.origin.x;
            begin.origin.x = begin.origin.y;
            begin.origin.y = tmp;
            
            tmp = end.origin.x;
            end.origin.x = end.origin.y;
            end.origin.y = tmp;
        }
        else
        {
            tmp = begin.size.width;
            begin.size.width = begin.size.height;
            begin.size.height = tmp;
            
            tmp = end.size.width;
            end.size.width = end.size.height;
            end.size.height = tmp;
            
            tmp = viewSize.width;
            viewSize.width = viewSize.height;
            viewSize.height = tmp;
            
            tmp = begin.origin.x;
            begin.origin.x = begin.origin.y;
            begin.origin.y = viewSize.height - tmp - begin.size.height;
            
            tmp = end.origin.x;
            end.origin.x = end.origin.y;
            end.origin.y = viewSize.height - tmp - end.size.height;
        }
        break;
        
    default:
        break;
}

float scaleX = cocos2d::CCEGLView::sharedOpenGLView()->getScaleX();
float scaleY = cocos2d::CCEGLView::sharedOpenGLView()->getScaleY();


if (self.contentScaleFactor == 2.0f)
{
    // Convert to pixel coordinate
    begin   = CGRectApplyAffineTransform(begin, CGAffineTransformScale(CGAffineTransformIdentity, 2.0f, 2.0f));
    end     = CGRectApplyAffineTransform(end  , CGAffineTransformScale(CGAffineTransformIdentity, 2.0f, 2.0f));
}

float offestY = cocos2d::CCEGLView::sharedOpenGLView()->getViewPortRect().origin.y;

// CCLOG(“offestY = %f”, offestY);
if (offestY < 0.0f)
{
begin.origin.y += offestY;
begin.size.height -= offestY;
end.size.height -= offestY;
}

// Convert to desigin coordinate
begin = CGRectApplyAffineTransform(begin, CGAffineTransformScale(CGAffineTransformIdentity, 1.0f/scaleX, 1.0f/scaleY));
end = CGRectApplyAffineTransform(end, CGAffineTransformScale(CGAffineTransformIdentity, 1.0f/scaleX, 1.0f/scaleY));


cocos2d::CCIMEKeyboardNotificationInfo notiInfo;
notiInfo.begin = cocos2d::CCRect(begin.origin.x,
                                 begin.origin.y,
                                 begin.size.width,
                                 begin.size.height);
notiInfo.end = cocos2d::CCRect(end.origin.x,
                               end.origin.y,
                               end.size.width,
                               end.size.height);

notiInfo.duration = (float)aniDuration;

cocos2d::CCIMEDispatcher* dispatcher = cocos2d::CCIMEDispatcher::sharedDispatcher();
if (UIKeyboardWillShowNotification == type) 
{
    self.keyboardShowNotification = notif; // implicit copy
    dispatcher->dispatchKeyboardWillShow(notiInfo);
}
else if (UIKeyboardDidShowNotification == type)
{
    //CGSize screenSize = self.window.screen.bounds.size;
    dispatcher->dispatchKeyboardDidShow(notiInfo);
    caretRect_ = end;
    caretRect_.origin.y = viewSize.height - (caretRect_.origin.y + caretRect_.size.height + );
    caretRect_.size.height = 0;
    isKeyboardShown_ = YES;
}
else if (UIKeyboardWillHideNotification == type)
{
    dispatcher->dispatchKeyboardWillHide(notiInfo);
}
else if (UIKeyboardDidHideNotification == type)
{
    caretRect_ = CGRectZero;
    dispatcher->dispatchKeyboardDidHide(notiInfo);
    isKeyboardShown_ = NO;
}

}

-(void) doAnimationWhenKeyboardMoveWithDuration:(float)duration distance:(float)dis
{
;
;
;
;

if (dis < 0.0f) dis = 0.0f;

dis *= cocos2d::CCEGLView::sharedOpenGLView()->getScaleY();

if (self.contentScaleFactor == 2.0f)
{
    dis /= 2.0f;
}

self.frame = CGRectMake(originalRect_.origin.x, originalRect_.origin.y - dis, originalRect_.size.width, originalRect_.size.height);
switch ( statusBarOrientation])
{
    case UIInterfaceOrientationPortrait:
        self.frame = CGRectMake(originalRect_.origin.x, originalRect_.origin.y - dis, originalRect_.size.width, originalRect_.size.height);
        break;
        
    case UIInterfaceOrientationPortraitUpsideDown:
        self.frame = CGRectMake(originalRect_.origin.x, originalRect_.origin.y + dis, originalRect_.size.width, originalRect_.size.height);
        break;
        
    case UIInterfaceOrientationLandscapeLeft:
        if ( systemVersion] floatValue] < 8.0)
        {
            self.frame = CGRectMake(originalRect_.origin.x - dis, originalRect_.origin.y , originalRect_.size.width, originalRect_.size.height);
        }
        else{
            self.frame = CGRectMake(originalRect_.origin.x, originalRect_.origin.y - dis, originalRect_.size.width, originalRect_.size.height);
        }
            break;
    case UIInterfaceOrientationLandscapeRight:
        if ( systemVersion] floatValue] < 8.0)
        {
            self.frame = CGRectMake(originalRect_.origin.x + dis, originalRect_.origin.y , originalRect_.size.width, originalRect_.size.height);
        }
        else{
            self.frame = CGRectMake(originalRect_.origin.x, originalRect_.origin.y - dis, originalRect_.size.width, originalRect_.size.height);
        }
        break;
        
    default:
        break;
}

;

}

希望对你有帮助。

似乎用xcode5编译出来安装到ios8是没问题的,可能是xcode6或者ios8 sdk的问题?

ios8某个测试版本有这个问题
推送版本已经不这样了
为了兼容或者以防以后更改,建议不要用版本号做判断,用宽和高谁长来区分

正式版xcode 6.0.1仍然会的,并没有解决

我使用的是推送版的8.0呀

coco2d-x 3.3里面做了修改 用这个函数判断statusBarOrientation
UIInterfaceOrientation getFixedOrientation(UIInterfaceOrientation statusBarOrientation)
{
if ( systemVersion] floatValue] >= 8.0)
{
statusBarOrientation = UIInterfaceOrientationPortrait;
}
return statusBarOrientation;
}

貌似这方法是可以,谢谢分享

3楼方法不错

灵活设定dis的值,效果极佳

mark~~~一下啊

我用的3.3的还是会出现这种问题

MAKE Re:【已解决】cocos2d-x 3.2中KeyboardMove在iOS8下异常