主页


quick cocos2dx2.2.6 lua 屏幕旋转横竖屏转换详解 屏幕方向自由切换

这里指的是程序中代码控制横竖屏转换

 

1. 先调用ios/android的api使屏幕旋转

IOS

在ios平台,cocos2dx的视图其实都是显示在一个UIViewController的。所以我们需要旋转UIViewController的方向。

在ios8以前只需调用以下代码:

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];
    [UIViewController attemptRotationToDeviceOrientation];    

    s_self->viewController.view.transform = CGAffineTransformMakeRotation(M_PI/2);
    float width =s_self->viewController.view.bounds.size.width;
    float height =s_self->viewController.view.bounds.size.height;
    s_self->viewController.view.bounds = CGRectMake(0, 0, height, width);

但是在ios8以后这样做就不行了。苹果不推荐手动修改UIViewController的方向。

苹果推荐的是重力使得屏幕自动旋转然后修改UI布局;或者是在切换UIViewController,新UIViewController有新的方向。

ios8做法:新建一个RootViewController2,代码跟RootViewController一样,只修改设置方向的相关代码。

在AppController里引入并初始化RootViewController2

AppController.h:

...
@public
RootViewController *viewController; @public RootViewController2 *viewController2;
....

AppController.mm:

static AppController *s_self;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    s_self = self;
    ....// Use RootViewController manage EAGLView
    viewController = [[RootViewController alloc] initWithNibName:nil bundle:nil];
    viewController.wantsFullScreenLayout = YES;
    viewController.view = __glView;
    
    viewController2 = [[RootViewController2 alloc] initWithNibName:nil bundle:nil];
    viewController2.wantsFullScreenLayout = YES;
    
    ....
}

切换RootViewController

+(void)changeRootViewController{
EAGLView *__glView = (EAGLView *)s_self->viewController.view; s_self->viewController.view = nil; s_self->viewController2.view = __glView; if ([[UIDevice currentDevice].systemVersion floatValue] < 6.0) { [s_self->window addSubview:s_self->viewController2.view]; } [s_self->window setRootViewController:s_self->viewController2];

      [__glView setOriginalRect:__glView.frame];


    
    CCLOG("____________________________");
    CCLOG("glView  retainCount %lu",(unsigned long)[__glView retainCount]);
    CCLOG("viewController retainCount %lu",(unsigned long)[s_self->viewController retainCount]);
    CCLOG("viewController2 retainCount %lu",(unsigned long)[s_self->viewController2 retainCount]);
}

RootViewController.mm控制方向代码:

- (NSUInteger) supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;    //横

     //UIInterfaceOrientationMaskLandscape  竖

}

Android

AndroidManifest.xml

..
<activity android:name=".XXX"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            android:screenOrientation="portrait"
            android:configChanges="orientation">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
..

xxx.java 旋转屏幕

public static void changeOrientationToLandscape(){
        _this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
public static void changeOrientationToPortrait(){
        _this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);        
}

 2. 修改DesignResolutionSize和FrameSize

 

  
  -- 调用oc java代码修改方向
  if
device.platform == "ios" then luaoc.callStaticMethod("AppController", "changeToRootViewController") elseif device.platform == "android" then luaj.callStaticMethod("com/iwo/doudizhu/Doudizhu", "changeOrientationToPortrait") end -- 修改FrameSize width height互换 local frameSize = CCEGLView:sharedOpenGLView():getFrameSize() CCEGLView:sharedOpenGLView():setFrameSize(frameSize.height,frameSize.width) -- 修改DesignResolutionSize 修改lua display相关值 主要是width height互换 glview:setDesignResolutionSize(....)
  display...

 

posted @ 2015-03-06 10:51  百年工作经验  阅读(2381)  评论(0编辑  收藏  举报