美文网首页
cocos2dx项目(quick3.3)中旋转屏幕(竖屏转横屏)

cocos2dx项目(quick3.3)中旋转屏幕(竖屏转横屏)

作者: Jey | 来源:发表于2019-12-21 14:55 被阅读0次
旋转屏幕

通知原生层旋转屏幕

+ (void) setInterfaceOrientation:(NSDictionary *)dict {
    // isupdate  hasupdate 是更新qp后的标识,控制旋转,isLLDJ是小游戏标识,控制是否广g
    RootViewController *rootVC = (RootViewController *)[UIApplication sharedApplication].keyWindow.rootViewController;
    rootVC.needToRotate = YES;
    if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight) {
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"needToRorate"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
          SEL selector             = NSSelectorFromString(@"setOrientation:");
          NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
          [invocation setSelector:selector];
          [invocation setTarget:[UIDevice currentDevice]];
          NSInteger val                  = [[dict objectForKey:@"orientation"] integerValue];
          [invocation setArgument:&val atIndex:2];
          [invocation invoke];
      }
    rootVC.isRotated = YES;
}

在项目RootViewController中,那个key值在进入程序的时候移除一次

- (NSUInteger) supportedInterfaceOrientations{
#ifdef __IPHONE_6_0
    if (ConfigParser::getInstance()->isLanscape()) {
        return UIInterfaceOrientationMaskLandscape;
    }else{
        if (_needToRotate) {
            if (_isRotated) {
                return UIInterfaceOrientationMaskLandscapeRight;
            }
            return UIInterfaceOrientationMaskAll;
        }else {
            return UIInterfaceOrientationMaskPortrait;
        }
        return UIInterfaceOrientationMaskAll;
        
        return UIInterfaceOrientationMaskPortraitUpsideDown;
    }
#endif
}

- (BOOL) shouldAutorotate {
    
    if (ConfigParser::getInstance()->isLanscape()) {
        return YES;
    }else{
        if (_needToRotate) {
            if (_isRotated) {
                return NO;
            }
            return YES;
        } else {
            return NO;
        }
        
        return NO;
    }
}

在cocos项目中重新设置GLView的frame,重新加载display文件

    local frameSize = cc.Director:getInstance():getOpenGLView():getFrameSize()
    cc.Director:getInstance():getOpenGLView():setFrameSize(frameSize.height,frameSize.width)
    
    -- 修改DesignResolutionSize 修改lua display相关值  主要是width height互换
    cc.Director:getInstance():getOpenGLView():setDesignResolutionSize(frameSize.height, frameSize.width, cc.ResolutionPolicy.NO_BORDER)
    CONFIG_SCREEN_WIDTH  = 1280
    CONFIG_SCREEN_HEIGHT = 720
    CONFIG_SCREEN_ORIENTATION = "landscape"
    package.loaded['framework.display'] = nil
    display    = require("framework.display")
适配输入框

先看这里

UIInterfaceOrientation getFixedOrientation(UIInterfaceOrientation statusBarOrientation)
{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
    {
        statusBarOrientation = UIInterfaceOrientationPortrait;
    }
    return statusBarOrientation;
}

写的是不是看不懂了,不要急:

-(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:
            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];
}
-(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:
        {
            BOOL needToRorate = [[NSUserDefaults standardUserDefaults] boolForKey:@"needToRorate"];
            if (not needToRorate) {
                self.frame = CGRectMake(originalRect_.origin.x, originalRect_.origin.y - dis, originalRect_.size.height, originalRect_.size.width);
            }
            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];
}

相关文章

网友评论

      本文标题:cocos2dx项目(quick3.3)中旋转屏幕(竖屏转横屏)

      本文链接:https://www.haomeiwen.com/subject/vtohyctx.html