cocos2d 3.2版本IOS因键盘引起横竖屏问题

原创 2016年08月30日 10:32:11

在cocos2d 3.2版本中,在IOS8.0以上游戏才用横竖屏都支持后,弹出输入法,或者游戏切到后台弹出输入法再切回来会引起屏幕跑偏,修复方案如下:

修改CCEAGLView.mm文件,注意第一个case的处理

-(void) doAnimationWhenKeyboardMoveWithDuration:(float)duration distance:(float)dis
{
    [UIView beginAnimations:nil context:nullptr];
	[UIView setAnimationDelegate:self];
	[UIView setAnimationDuration:duration];
	[UIView setAnimationBeginsFromCurrentState:YES];
    
    //NSLog(@"[animation] dis = %f, scale = %f \n", dis, cocos2d::GLView::getInstance()->getScaleY());
    
    if (dis < 0.0f) dis = 0.0f;

    auto glview = cocos2d::Director::getInstance()->getOpenGLView();
	dis *= glview->getScaleY();
    
    if (self.contentScaleFactor == 2.0f)
    {
        dis /= 2.0f;
    }
    
    switch ([self getstatusBarOrientation])
    {
        case UIInterfaceOrientationPortrait:
            if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
            {
                self.frame = CGRectMake(originalRect_.origin.x, originalRect_.origin.y - dis, self.frame.size.width, self.frame.size.height);
            }else{
                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:
            self.frame = CGRectMake(originalRect_.origin.x - dis, originalRect_.origin.y , originalRect_.size.width, originalRect_.size.height);
            break;
            
        case UIInterfaceOrientationLandscapeRight:
            self.frame = CGRectMake(originalRect_.origin.x + dis, originalRect_.origin.y , originalRect_.size.width, originalRect_.size.height);
            break;
            
        default:
            break;
    }
    
	[UIView commitAnimations];
}

在其他cocos版本中,采用以下方法处理:

-(void) doAnimationWhenKeyboardMoveWithDuration:(float)duration distance:(float)dis
{
    [UIView beginAnimations:nil context:nullptr];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:duration];
    [UIView setAnimationBeginsFromCurrentState:YES];
 
    //NSLog(@"[animation] dis = %f, scale = %f \n", dis, cocos2d::GLView::getInstance()->getScaleY());   
    if (dis < 0.0f) dis = 0.0f;
    auto glview = cocos2d::Director::getInstance()->getOpenGLView();
    dis *= glview->getScaleY();   
    dis /= self.contentScaleFactor;
 
    switch (getFixedOrientation([[UIApplication sharedApplication] statusBarOrientation]))
    {
        case UIInterfaceOrientationPortrait:
            if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
            {
                self.frame = CGRectMake(originalRect_.origin.x, originalRect_.origin.y - dis, self.frame.size.width, self.frame.size.height);
            }else{
                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:
            self.frame = CGRectMake(originalRect_.origin.x - dis, originalRect_.origin.y , originalRect_.size.width, originalRect_.size.height);
            break;           
 
        case UIInterfaceOrientationLandscapeRight:
            self.frame = CGRectMake(originalRect_.origin.x + dis, originalRect_.origin.y , originalRect_.size.width, originalRect_.size.height);
            break;
 
        default:
            break;
    }
    [UIView commitAnimations];
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

cocos2d-x 调用虚拟键盘设置默认输入法

cocos2d-x里面默认输入法就是调用系统默认的输入法,然后可以切换数字、中英文等,但是有些需求想让输入法默认数字,比如输入密码或电话等,这样体验会好很多的。 别的不多说了,直接上步骤。 ...
  • houjia159
  • houjia159
  • 2013年12月19日 15:37
  • 3154

cocos TextField + ios键盘 状态监听 移动view

cocos TextField + ios键盘 状态监听 移动viewios监听键盘回退事件在appcontroller.mm文件,添加: [[NSNotificationCenter def...
  • liqiangxo
  • liqiangxo
  • 2016年12月09日 18:45
  • 1089

关于Cocos2d-x在新版xcode下横竖屏设置

ios开发中屏幕的设置本来是一个很简单的问题,但是有时候由于各种问题就是不尽人意,这里面有一个问题有的人没注意,就是游戏的横竖屏设置和开发环境里模拟器屏幕的横竖摆放设置: 首先,很多博文都有教程通过代...
  • cordova
  • cordova
  • 2016年03月11日 09:18
  • 1048

cocos2d-x游戏开发屏幕横竖屏切换

android解决方案: 1.在游戏的主activity中编写一个静态方法(继承Cocos2dxActivity) public static void changedActivityOrient...
  • aizhiqiang2
  • aizhiqiang2
  • 2016年03月24日 14:48
  • 3226

横竖屏切换 cocos2dx

cocos2dx 横竖屏切换
  • Code_Nice
  • Code_Nice
  • 2017年06月11日 16:19
  • 232

在Cocos2d-x上实现横竖屏切换

在Cocos2d-x上实现横竖屏切换 该demo使用引擎3.10版本,经测试在Android,PC上都OK 第一步在AppDelegate重写applicationScreenSizeChanged方...
  • HqZvezda
  • HqZvezda
  • 2016年05月11日 20:05
  • 3431

cocos2d-x中添加Enter键和方向键按键响应

最近有个机顶盒项目,需要用到遥控器的方向键来控制游戏。 如果是一般Android设备、iOS设备或Win32平台,cocos2d-x提供了“CCAccelerometer”,可用于游戏控制UI。但由于...
  • keshuiyun
  • keshuiyun
  • 2013年08月06日 11:32
  • 10409

Cocos2dx 禁止锁屏

IOS版本: 在文件 cocos2d::CCApplication::sharedApplication()->run();
  • tyxkzzf
  • tyxkzzf
  • 2014年08月28日 19:35
  • 4837

cocos2dx ios中横屏切换竖屏相册崩溃

做了3个月的项目,终于把安卓版本弄上线了,接下来就是苦逼的搞苹果版本。然而一开始就遇到一个问题,因为我们项目是横屏的,但是调用系统相册的时候,因为系统相册是竖屏的,直接就闪退了。 报错信息:'Sup...
  • lyf348864485
  • lyf348864485
  • 2017年11月02日 16:42
  • 119

iOS强制转换横竖屏和键盘方向控制

前言     在开发中,有时候我们回到这样一种需求:从一个竖屏界面跳转到下一个横屏界面,或者反之。如果是安卓的话,就很简单,安卓系统提供这样的API,直接操作即可。但是iOS就不好办了,在iOS3.0...
  • gang544043963
  • gang544043963
  • 2017年03月13日 20:30
  • 4292
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2d 3.2版本IOS因键盘引起横竖屏问题
举报原因:
原因补充:

(最多只允许输入30个字)