猴子原创,欢迎转载。转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢!

原文地址: http://www.cocos2dev.com/?p=248

前段时间项目中要微博授权登陆,使用的是web登陆方式。所以要在cocos2d-x中显示网页。所以就将UIWebView用进来了。

实现上讲也不是很难,你开打AppController.mm,你可以看到cocos2d-x的场景是被加载在一个EAGLView上面。所以我只需要取到EAGLView,在上面加一个UIView,UIView上面就可以放我的UIWebView。

实现:FMUIWebViewBridge.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#import <Foundation/Foundation.h>
 
#import <CoreLocation/CoreLocation.h>
 
#import <UIKit/UIKit.h>
 
&nbsp;
 
#import "FMLayerWebView.h"
 
&nbsp;
 
@interface FMUIWebViewBridge : NSObject<UIWebViewDelegate,UIAlertViewDelegate>{
 
FMLayerWebView * mLayerWebView;
 
UIView    *mView;
 
UIWebView *mWebView;
 
UIToolbar *mToolbar;
 
UIBarButtonItem *mBackButton;
 
}
 
&nbsp;
 
-(void) setLayerWebView : (FMLayerWebView*) iLayerWebView URLString:(const char*) urlString;
 
-(void) backClicked:(id)sender;
 
&nbsp;
 
@end

FMUIWebViewBridge.mm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
//
 
//  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];
 
}
 
&nbsp;
 
-(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];
 
&nbsp;
 
// add the webView to the view
 
[mView addSubview:mWebView];
 
[[EAGLView sharedEGLView] addSubview:mView];
 
}
 
&nbsp;
 
- (void)webViewDidStartLoad:(UIWebView *)thisWebView {
 
}
 
&nbsp;
 
- (void)webViewDidFinishLoad:(UIWebView *)thisWebView{
 
[mWebView setUserInteractionEnabled:YES];
 
mLayerWebView->webViewDidFinishLoad();
 
}
 
&nbsp;
 
- (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.
 
&nbsp;
 
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];
 
&nbsp;
 
}
 
}
 
&nbsp;
 
-(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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//
 
//  FMLayerWebView.h
 
//  WebViewDemo
 
//
 
//  Created by Yanghui Liu on 12-6-5.
 
//  Copyright (c) 2012年 FMinutes company. All rights reserved.
 
//
 
&nbsp;
 
#ifndef WebViewDemo_FMLayerWebView_h
 
#define WebViewDemo_FMLayerWebView_h
 
&nbsp;
 
#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;
 
};
 
&nbsp;
 
#endif
<div></div>

FMLayerWebView.mm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//
 
//  FMLayerWebView.mm
 
//  WebViewDemo
 
//
 
//  Created by Yanghui Liu on 12-6-5.
 
//  Copyright (c) 2012年 FMinutes company. All rights reserved.
 
//
 
&nbsp;
 
#include "FMLayerWebView.h"
 
#include "FMUIWebViewBridge.h"
 
&nbsp;
 
static FMUIWebViewBridge *g_FMUIWebViewBridge=nil;
 
&nbsp;
 
FMLayerWebView::FMLayerWebView(){
 
}
 
&nbsp;
 
FMLayerWebView::~FMLayerWebView(){
 
[g_FMUIWebViewBridge release];
 
}
 
&nbsp;
 
void FMLayerWebView::webViewDidFinishLoad(){
 
}
 
&nbsp;
 
void FMLayerWebView::onBackbuttonClick(){
 
this->removeFromParentAndCleanup(true);
 
}
 
&nbsp;
 
bool FMLayerWebView::init(){
 
if ( !CCLayer::init() ){
 
return false;
 
}
 
g_FMUIWebViewBridge = [[FMUIWebViewBridge alloc] init];
 
[g_FMUIWebViewBridge setLayerWebView : this URLString:"http://www.cocos2dev.com"];
 
return true;
 
}

OK ,这样就完成了。

调用方法:

1
2
3
4
5
FMLayerWebView* web = FMLayerWebView::node();
 
web->setPosition(CCPointZero);
 
addChild(web);

cocos2d-x 使用UIWebView加载网页(顺便可以看到如何用OC调C++)的更多相关文章

  1. 【iOS系列】-UIWebView加载网页禁止左右滑动

    [iOS系列]-UIWebView加载网页禁止左右滑动 问题: 做项目时候,用UIWebView加载网页的时候,要求是和微信网页中打开的网页的效果一样,也即是只能上下滑动,不能左右滑动,也不能缩放. ...

  2. UIWebView 加载网页、文件、 html-b

    UIWebView  是用来加载加载网页数据的一个框.UIWebView可以用来加载pdf word doc 等等文件 生成webview 有两种方法,1.通过storyboard 拖拽 2.通过al ...

  3. UIWebView 加载网页、文件、 html

    UIWebView  是用来加载加载网页数据的一个框.UIWebView可以用来加载pdf word doc 等等文件 生成webview 有两种方法,1.通过storyboard 拖拽 2.通过al ...

  4. Swift-01 UIWebView加载网页

    UIWebView在swift里面的语法,和OC不太一样,但是,使用方法什么的,都是从OC演变过来的.比如,都得有init方法,都有loadRequest方法,所以,有了OC这个基础,学习swift是 ...

  5. 关于iOS UIWebView 加载网页,点击网页内某些控件导致 Application 'UIKitApplication:xxx.xxx.xxx' was killed by jetsam.

    问题:公司用的腾讯问卷系统,内嵌在我们应用或游戏的自定义UIWebView里面展示,发现在iOS 10 以下系统,点击圆形勾选框 会大概率出现闪退. 通过联调发现:报了这样一个警告Applicatio ...

  6. UIWebView各种加载网页的方式

    UIWebView加载网页的方法 最近在使用UIWebView的时候遇到各种不同形式加载网页的方式,总结起来共有三种方式,分别为:使用URL加载,使用HTML源码加载,使用HTML文件加载,各种方法的 ...

  7. iOS之webview加载网页、文件、html的方法

    UIWebView  是用来加载加载网页数据的一个框.UIWebView可以用来加载pdf.word.doc 等等文件 生成webview 有两种方法,1.通过storyboard 拖拽  2.通过a ...

  8. 【iOS进阶】UIWebview加载搜狐视频,自动跳回客户端 问题解决

    UIWebview加载搜狐视频,自动跳回搜狐客户端 问题解决 当我们用UIWebview(iOS端)加载网页视频的时候,会发现,当真机上有搜狐客户端的时候,会自动跳转到搜狐客户端进行播放,这样的体验对 ...

  9. Android中Http加载如何得到Cookie和 WebView 加载网页如何得到的Cookie

    最近做项目在手机端登录Http请求和 WebView 记载登录获取Cookie信息,可查看Cookie信息. 如图: Http请求获取Cookie信息: public static String re ...

随机推荐

  1. javascript BOM对象 第15节

    <html> <head> <title>浏览器对象</title> <script type="text/javascript&quo ...

  2. webui layout like desktop rich client

    similarity similarlike desktop js frameworklike extj js frameworklike rich client js frameworkjs lay ...

  3. 04_XML_03_XMLDTD约束与校验

    [什么是XML约束] 在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,称之为XML约束. 常见的XML约束技术有:XML DTD和XML Schema DTD(Document Typ ...

  4. OpenGL_Qt学习笔记之_05(纹理映射)(转)

    转自:http://www.cnblogs.com/tornadomeet/archive/2012/08/24/2654719.html 纹理映射基础知识 什么叫纹理映射,一开始我也不明白,感觉这个 ...

  5. 如何用angularjs制作一个完整的表格之三__在ng-repeat中使用ng-model

    在ng-repeat中使用ng-model时会有许多问,有的人碰到无法获取绑定的数据内容,有的人遇到改动绑定的数据内容时所有循环生成的内容一起改变.上面的问题我在开发时也遇到过,但是解决后我却怎么也还 ...

  6. Expat Parser解析xml文件

    Expat 解析器是基于事件的解析器. 基于事件的解析器集中在 XML 文档的内容,而不是它们的结构.正因为如此,基于事件的解析器能够比基于树的解析器更快地访问数据. 请看下面的 XML 片段: &l ...

  7. html5音频和视频相关属性和方法

    方法 方法 描述 addTextTrack() 为音视频加入一个新的文本轨迹 canPlayType() 检查指定的音视频格式是否得到支持 load() 重新加载音视频标签 play() 播放音视频 ...

  8. linux服务器监控流量sh脚本

    服务器可能经常遇到服务器出带宽跑满,不知如何查询被哪个进程占用的情况,有一款开源的英文软件iftop功能比较强大可以查询相关信息,可能刚接触linux系统的朋友不太会使用,在此写了一个功能比较简单无需 ...

  9. lucene解决全文检索word2003,word2007的办法

    在上一篇文章中 ,lucene只能全文检索word2003,无法检索2007,并且只能加载部分内容,无法加载全文内容.为解决此问题,找到了如下方法 POI 读取word (word 2003 和 wo ...

  10. C++引用作为函数的参数

    引用也可以作为一个函数的参数,如:我们定义交换两个数的函数swap,将函数的参数定义成引用的形式: void swap(int &p1, int &p2) //此处函数的形参都是引用 ...