原文来自:Cocos2d 开发网
前段时间项目中要微博授权登陆,使用的是web登陆方式。所以要在cocos2d-x中显示网页。所以就将UIWebView用进来了。
cocos2d-x 使用UIWebView加载网页
实现上讲也不是很难,你开打AppController.mm,你可以看到cocos2d-x的场景是被加载在一个EAGLView上面。所以我只需要取到EAGLView,在上面加一个UIView,UIView上面就可以放我的UIWebView。
实现:FMUIWebViewBridge.h
#import
#import
#import
 
#import "FMLayerWebView.h"
 
@interface FMUIWebViewBridge : NSObject{
FMLayerWebView * mLayerWebView;
UIView *mView;
UIWebView *mWebView;
UIToolbar *mToolbar;
UIBarButtonItem *mBackButton;
}
-(void) setLayerWebView : (FMLayerWebView*) iLayerWebView URLString:(const char*) urlString;
-(void) backClicked:(id)sender;
@end

FMUIWebViewBridge.mm
//
// FMUIWebViewBridge.cpp
// WebViewDemo
//
// Created by Yanghui Liu on 12-6-5.
// Copyright (c) 2012年 FMinutes company. All rights reserved.
//
#import "FMUIWebViewBridge.h"
#import "EAGLView.h"
@implementation FMUIWebViewBridge
- (id)init{
self = [super init];
if (self) {
// init code here.
}
return self;
}
- (void)dealloc{
[mBackButton release];
[mToolbar release];
[mWebView release];
[mView release];
[super dealloc];
}
-(void) setLayerWebView : (FMLayerWebView*) iLayerWebView URLString:(const char*) urlString{
mLayerWebView = iLayerWebView;
cocos2d::CCSize size = mLayerWebView-> getContentSize();
mView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, size.width , size.height)];
// create webView
//Bottom size
int wBottomMargin = size.height*0.10;
int wWebViewHeight = size.height - wBottomMargin;
mWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, size.width, wWebViewHeight)];
mWebView.delegate = self;
NSString *urlBase = [NSString stringWithCString:urlString encoding:NSUTF8StringEncoding];
[mWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlBase ]]];
[mWebView setUserInteractionEnabled:NO]; //don't let the user scroll while things are
//create a tool bar for the bottom of the screen to hold the back button
mToolbar = [UIToolbar new];
[mToolbar setFrame:CGRectMake(0, wWebViewHeight, size.width, wBottomMargin)];
mToolbar.barStyle = UIBarStyleBlackOpaque;
//Create a button
mBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back"
style: UIBarButtonItemStyleDone
target: self
action:@selector(backClicked:)];
//[backButton setBounds:CGRectMake(0.0, 0.0, 95.0, 34.0)];
[mToolbar setItems:[NSArray arrayWithObjects:mBackButton,nil] animated:YES];
[mView addSubview:mToolbar];
//[mToolbar release];
// add the webView to the view
[mView addSubview:mWebView];
[[EAGLView sharedEGLView] addSubview:mView];
}
- (void)webViewDidStartLoad:(UIWebView *)thisWebView {
}
- (void)webViewDidFinishLoad:(UIWebView *)thisWebView{
[mWebView setUserInteractionEnabled:YES];
mLayerWebView->webViewDidFinishLoad();
}
- (void)webView:(UIWebView *)thisWebView didFailLoadWithError:(NSError *)error {
if ([error code] != -999 && error != NULL) { //error -999 happens when the user clicks on something before it's done loading.
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Network Error" message:@"Unable to load the page. Please keep network connection."
delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
[alert show];
[alert release];
}
}
-(void) backClicked:(id)sender {
mWebView.delegate = nil; //keep the webview from firing off any extra messages
//remove items from the Superview...just to make sure they're gone
[mToolbar removeFromSuperview];
[mWebView removeFromSuperview];
[mView removeFromSuperview];
mLayerWebView->onBackbuttonClick();
}
@end

因为这些都是OC代码,所以文件后缀使用mm,为了和C++代码混编。代码很简答,应该看得懂,我就不解释了。
下面就是封装这个oc代码,
FMLayerWebView.h
// FMLayerWebView.h
// WebViewDemo
// Created by Yanghui Liu on 12-6-5.
// Copyright (c) 2012年 FMinutes company. All rights reserved.
//
#ifndef WebViewDemo_FMLayerWebView_h
#define WebViewDemo_FMLayerWebView_h
#include "CCCommon.h"
#include "cocos2d.h"
USING_NS_CC;
class FMLayerWebView : public CCLayer{
public:
FMLayerWebView();
~FMLayerWebView();
virtual bool init();
LAYER_NODE_FUNC(FMLayerWebView);
void webViewDidFinishLoad();
void onBackbuttonClick();
private:
int mWebViewLoadCounter;
};
#endif
FMLayerWebView.mm
//
// FMLayerWebView.mm
// WebViewDemo
//
// Created by Yanghui Liu on 12-6-5.
// Copyright (c) 2012年 FMinutes company. All rights reserved.
//
#include "FMLayerWebView.h"
#include "FMUIWebViewBridge.h"
static FMUIWebViewBridge *g_FMUIWebViewBridge=nil;
FMLayerWebView::FMLayerWebView(){
}
FMLayerWebView::~FMLayerWebView(){
[g_FMUIWebViewBridge release];
}
void FMLayerWebView::webViewDidFinishLoad(){
}
void FMLayerWebView::onBackbuttonClick(){
this->removeFromParentAndCleanup(true);
}
bool FMLayerWebView::init(){
if ( !CCLayer::init() ){
return false;
}
g_FMUIWebViewBridge = [[FMUIWebViewBridge alloc] init];
[g_FMUIWebViewBridge setLayerWebView : this URLString:"http://www.cocos2dev.com"];
return true;
}

调用方法:
FMLayerWebView* web = FMLayerWebView::node();
web->setPosition(CCPointZero);
addChild(web);