【问题标题】:Add UIViewController in cocos2d在 cocos2d 中添加 UIViewController
【发布时间】:2023-03-12 02:53:02
【问题描述】:

我想在 cocos2d 项目中显示 UIViewController,所以我在我的 CCLayer 类中这样做了:

-(void)displayMainMenu {
    CGSize screenSize = [CCDirector sharedDirector].winSize;
    [CCMenuItemFont setFontName:@"Marker Felt"];
    [CCMenuItemFont setFontSize:26];

    CCMenuItemFont *openViewC = [CCMenuItemFont itemWithString:@"Open View" target:self selector:@selector(loadMyViewController)];
    mainMenu = [CCMenu menuWithItems:openViewC, nil];
    [self addChild:mainMenu z:0];
}

-(void) loadMyViewController{

    //Add the tableview when the transition is done
    myView = [[MyViewController alloc] init];
    UIView *viewHost = hostView.view;

    [[[CCDirector sharedDirector] view] addSubview:viewHost];
}

然后在我的 ViewController 中返回我的 CCLayer 我这样做:

- (IBAction)exitAction:(id)sender
    {
    [self.view removeFromSuperview];

    [[CCDirector sharedDirector] pushScene: [MainMenu scene]]; //i need it or not?
}

一切正常,我使用 cocos2d v2.0,但我想知道是否有更好的方法在 cocos2d 场景中添加 UIViewController,谢谢!

【问题讨论】:

  • 为了避免泄漏,将 MyViewController als childViewController 添加到 Director 并在添加后释放 myView。删除时,从超级视图中删除 myView 及其视图。 myView 涵盖了渲染 CCNode 的 eaglview。所以你不需要推送和弹出 CCLayers。
  • 你能在答案中更好地解释它吗?谢谢,我等着呢!

标签: iphone ios uiviewcontroller cocos2d-iphone


【解决方案1】:

由于 cocos2d 2.0 中的 director 是 UIViewController 的子类,作为加载在 AppDelegate 中的导航控制器的根,如果您愿意,实际上有一个非常简单的方法可以利用 UIKit 动画。它还使场景完好无损,而无需真正担心内存管理。您可以将您的 -loadMyViewController 方法更改为:

- (void)loadMyViewController {
     myView = [[MyViewController alloc] init];
     AppController *app = (AppController *)[[UIApplication sharedApplication] delegate];
     [app.navController pushViewController:myView animated:YES];
     [CCDirector sharedDirector].pause;
}

然后在想要返回 cocos2d 场景时简单地恢复 director 并调用 [app.navController popViewController...]。或者,您可以在推送视图控制器而不是暂停时使用 stopAnimation 方法,类似于 cocos2d 处理应用进入后台的方式。

【讨论】:

  • 你还能从 cocos2d 节点内的 uikit 控件中获得回调等吗?
【解决方案2】:

如果你想弹出一个视图,你可以使用一个简单的代码,只需导入 yourviewcontroller.h 文件并使用支持所有 cocos2d 版本的代码

- (void)loadMyViewController {

     yourviewcontroller  *myView = [[yourviewcontroller alloc] init];

     UIView *viewHost = myView.view;

    [[[CCDirector sharedDirector] openGLView] addSubview:viewHost];

}

//如果你想减少内存使用或只是暂停它,更换屏幕

【讨论】:

    【解决方案3】:

    如果是cocos2D 2.0,那就用这个吧。

    AppController *app = (AppController*) [[UIApplication sharedApplication] delegate];
            [app.navController.view addSubview:newView];
    

    以下 cocos2d 2.0

    AppDelegate* app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
        [app .viewController.view addSubview:newView];
    

    【讨论】:

    • 比我的解决方案好?
    【解决方案4】:

    或者你可以使用这个代码..

    ViewController *vc = [[ViewController alloc] init];
    
    AppController *app = (AppController*) [[UIApplication sharedApplication] delegate];
    
    [[app navController] presentModalViewController:vc animated:YES];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多