cocos2d-x 使用UIWebView加载网页(顺便可以看到如何用OC调C++)
猴子原创,欢迎转载。转载请注明: 转载自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> #import "FMLayerWebView.h" @interface FMUIWebViewBridge : NSObject<UIWebViewDelegate,UIAlertViewDelegate>{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
|
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];} -(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 sizeint 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 buttonmToolbar = [UIToolbar new];[mToolbar setFrame:CGRectMake(0, wWebViewHeight, size.width, wBottomMargin)];mToolbar.barStyle = UIBarStyleBlackOpaque;//Create a buttonmBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back"style: UIBarButtonItemStyleDonetarget: selfaction:@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
|
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.// #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<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.// #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];return true;} |
OK ,这样就完成了。
调用方法:
|
1
2
3
4
5
|
FMLayerWebView* web = FMLayerWebView::node();web->setPosition(CCPointZero);addChild(web); |
cocos2d-x 使用UIWebView加载网页(顺便可以看到如何用OC调C++)的更多相关文章
- 【iOS系列】-UIWebView加载网页禁止左右滑动
[iOS系列]-UIWebView加载网页禁止左右滑动 问题: 做项目时候,用UIWebView加载网页的时候,要求是和微信网页中打开的网页的效果一样,也即是只能上下滑动,不能左右滑动,也不能缩放. ...
- UIWebView 加载网页、文件、 html-b
UIWebView 是用来加载加载网页数据的一个框.UIWebView可以用来加载pdf word doc 等等文件 生成webview 有两种方法,1.通过storyboard 拖拽 2.通过al ...
- UIWebView 加载网页、文件、 html
UIWebView 是用来加载加载网页数据的一个框.UIWebView可以用来加载pdf word doc 等等文件 生成webview 有两种方法,1.通过storyboard 拖拽 2.通过al ...
- Swift-01 UIWebView加载网页
UIWebView在swift里面的语法,和OC不太一样,但是,使用方法什么的,都是从OC演变过来的.比如,都得有init方法,都有loadRequest方法,所以,有了OC这个基础,学习swift是 ...
- 关于iOS UIWebView 加载网页,点击网页内某些控件导致 Application 'UIKitApplication:xxx.xxx.xxx' was killed by jetsam.
问题:公司用的腾讯问卷系统,内嵌在我们应用或游戏的自定义UIWebView里面展示,发现在iOS 10 以下系统,点击圆形勾选框 会大概率出现闪退. 通过联调发现:报了这样一个警告Applicatio ...
- UIWebView各种加载网页的方式
UIWebView加载网页的方法 最近在使用UIWebView的时候遇到各种不同形式加载网页的方式,总结起来共有三种方式,分别为:使用URL加载,使用HTML源码加载,使用HTML文件加载,各种方法的 ...
- iOS之webview加载网页、文件、html的方法
UIWebView 是用来加载加载网页数据的一个框.UIWebView可以用来加载pdf.word.doc 等等文件 生成webview 有两种方法,1.通过storyboard 拖拽 2.通过a ...
- 【iOS进阶】UIWebview加载搜狐视频,自动跳回客户端 问题解决
UIWebview加载搜狐视频,自动跳回搜狐客户端 问题解决 当我们用UIWebview(iOS端)加载网页视频的时候,会发现,当真机上有搜狐客户端的时候,会自动跳转到搜狐客户端进行播放,这样的体验对 ...
- Android中Http加载如何得到Cookie和 WebView 加载网页如何得到的Cookie
最近做项目在手机端登录Http请求和 WebView 记载登录获取Cookie信息,可查看Cookie信息. 如图: Http请求获取Cookie信息: public static String re ...
随机推荐
- Ext.Net学习笔记03:Ext.Net MessageBus用法
发布和订阅消息 Ext.Net MessageBus 的本质是一个消息订阅机制,ExtJS中没有这种机制,所以MessageBus的Ext.Net实现的,但并不是原创,这种功能在dojo中早就实现了, ...
- sql的临时表使用小结
1.创建方法: 方法一:create table TempTableName或select [字段1,字段2,...,] into TempTableName from table 方法二:creat ...
- UiTextField对输入的长度进行限制并提示用户还可输入的长度
最近想做用户昵称的限制,但是网上百度了很多方法效果都不是我自己想要的,终于找到种方法 如下: 1.声明两个属性 nickname是昵称的textfleld canEditSizeLAbel是提示用户剩 ...
- c#泛型方法重载
这里存在普通的方法Foo和泛型方法Foo,如果直接调用: 则会自动优先匹配对应的非泛型方法.输出如下: 但需要注意的是,这一匹配过程是在编译过程进行的,所以如果是通过其它泛型间接调用.则只会调用对应的 ...
- frame 第三节
1.准备3个文件 main.html: <html> <head> <title>框架</title> </head> <frames ...
- C# Unix时间戳转换为时间
在做一些接口的时候,比如返回数据中有一个时间的属性,它的值是使用Unix时间戳表示的,当我们处理它(保存到本地或者格式化前台展示)时需要转换成日期时间,在此就需要根据时间戳转换为日期时间 (注:Uni ...
- java对象初始化顺序的简单验证
以下这段小程序对调用对象构造函数时,父类构造函数.成员变量初始化函数,以及非静态初始化块调用顺序进行验证,不考虑静态成员及静态初始化块. public class Derive extends Bas ...
- linux运维工程师,必须掌握以下几个工具
本人是linux运维工程师,对这方面有点心得,现在我说说要掌握哪方面的工具吧说到工具,在行外可以说是技能,在行内我们一般称为工具,就是运维必须要掌握的工具.我就大概列出这几方面,这样入门就基本没问题了 ...
- odoo 清除所有运行数据
测试odoo,如果需要一个干净的db.经常需要清除掉所有业务数据.做如下操作,较为方便 1:建立一个服务器动作,动作的python代码入下. 然后新建一个菜单,菜单动作关联到 这个动作.需要清空db, ...
- c++模板实例化的一个例子
以下是c++模板实例化的一个例子,虽然ObjectList::clear()里面调用的test()函数是没有定义的,但是以下代码能够编译通过,可见ObjectList::clear()未编译: tem ...