前言:本人原本是ios开发工程师,但由于现今H5的兴起,行内刮起了一阵混合开发的风气,趁着这股劲,我也学了前端开发,不说研究的多深,但也能胜任日常的开发工作。长话短说,现今的混合开发应该还处于摸索阶段,我们的项目主要页面都是由网页做的,只有一些IM、支付、分享、推送、上传照片这些用的是原生功能,大家都知道ios原生app的体验一直是很好的,现在改成了混合开发,无疑中就有些舍弃了ios原生的用户体验,而这个作为一个向来以用户体验为先的开发人员来说,这个真的是难以忍受,所以开始了以优化用户体验的为目标的各种尝试。

优化页面跳转功能

app中的翻页常用的分为两类,一种通过导航,一种直接跳

1、第一种 直接跳转 思路大致就是new一个目的页面,然后设置下页面跳转动画 中间还可以做点目的页面的数据初始化:

1 ValueInputView *valueView = [[ValueInputView alloc] initWithNibName:@"ValueInputView"bundle:[NSBundle mainBundle]];2

3 valueView.delegate =self;4

5 [valueView setModalTransitionStyle:UIModalTransitionStyleCoverVertical];6

7 [self presentModalViewController:valueView animated:YES];8

9 //返回

10

11 [self dismissModalViewControllerAnimated:YES];

2、利用UINavigationController,调用pushViewController,进行跳转;这种采用压栈和出栈的方式,进行Controller的管理。调用popViewControllerAnimated方法可以返回

PickImageViewController *ickImageViewController =[[PickImageViewController alloc] init];

[self.navigationController pushViewController: ickImageViewController animated:true];

而我们在网页中的跳转就很直接,一个webview中转换不同的URL,很明显这样的方法呈现给用户的体验很差,所以得想办法去优化,最好的解决办法就是去模仿原生的页面跳转。为此我查看了很多的知名app,但我发现大多数混合开发的app都只是某几个页面用的是网页开发,然后再webview所在页面加上进度条,所以给用户感觉不是很突兀,比如饿了么之类的。但这很明显不适用于我们的APP,所以我当时想的是这样做的,加载一个UIScrollView,然后在ScrollView上去添加webview,每点击一次webview里面的跳转时,生成一个新的webview添加在第二屏的位置,以此类推每次进入新页面都可以用这种方式。

//初始化页面的操作

-(void)initView{

_scrollView= [[UIScrollView alloc]initWithFrame:CGRectMake(0, 20, kWidth, kHeight-20)];

_scrollView.backgroundColor=[UIColor whiteColor];

_scrollView.contentSize= CGSizeMake(60*kWidth, kHeight);

_scrollView.pagingEnabled=YES;

_scrollView.scrollEnabled=NO;

_scrollView.bounces=NO;//隐藏水平滚动条

_scrollView.showsHorizontalScrollIndicator=NO;//隐藏垂直滚动条

_scrollView.showsVerticalScrollIndicator=NO;

_scrollView.contentOffset= CGPointMake(0, 0);//创建初始的WebView

_myWebView= [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, kWidth, kHeight-20)];

_myWebView.backgroundColor=[UIColor grayColor];//地址是我乱写的

NSString*urlString = @"http://www.baidu.com"NSURL*url =[NSURL URLWithString:urlString];

NSURLRequest*request =[NSURLRequest requestWithURL:url];

_myWebView.scrollView.bounces=NO;

_myWebView.scalesPageToFit=NO;

_myWebView.delegate =self;

[_myWebView loadRequest:request];

[self.scrollView addSubview:_myWebView];

[self.view addSubview:_scrollView];//执行交互操作

[self mutualOCwithJS];

}

//进入下一页

-(void)nextWeb{//翻页动效

CGPoint offSet =self.scrollView.contentOffset;//在新页面里创建webview

UIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectMake(offSet.x+kWidth, 0, kWidth, kHeight-20)];

webView.backgroundColor=[UIColor grayColor];

NSString*urlString =_urlWeb;

NSURL*url =[NSURL URLWithString:urlString];

_lastoffset=offSet.x;

NSURLRequest*request =[NSURLRequest requestWithURL:url];

webView.scrollView.bounces=NO;

webView.scalesPageToFit=YES;

webView.delegate =self;

[webView loadRequest:request];

[self.scrollView addSubview:webView];

offSet.x+=kWidth;

[self.scrollView setContentOffset:offSet animated:YES];//写入字典

[_webArray addObject:webView];

[_urlArray addObject:urlString];

_count++;

[_webDict setObject:_webArray[_count] forKey:_urlArray[_count]];//[self startAnimation];//执行交互操作

[self mutualOCwithJS];

}

但这种方式带来的问题是内存暴涨,显然还需要优化,于是我想到添加两个数组去分别存储新打开页面的url和webview,

//初始化数组和字典

_webArray=[[NSMutableArray alloc]init];

[_webArray addObject:_myWebView];

_urlArray=[[NSMutableArray alloc]init];

[_urlArray addObject:urlString];

_webDict=[NSMutableDictionary dictionary];

[_webDict setObject:_webArray[_count] forKey:_urlArray[_count]];

当跳转至频道页首页的时候将数组清空,同时把当前位置变为ScrollView的0位置,

NSString *resultStr = [webView stringByEvaluatingJavaScriptFromString:@"document.body.getAttribute(‘data‘)"];//页面中含有频道页首页标记

if (![resultStr isEqualToString:@""]) {for (int i = 0; i<_count i>

[_webDict removeObjectForKey:_urlArray[0]];

[_webArray[0] stopLoading];

[_webArray[0] removeFromSuperview];

[_webArray removeObjectAtIndex:0];

[_urlArray removeObjectAtIndex:0];

}

_count= _webArray.count-1;

}

当页面返回时,把数组的最后一个数据移除,

//返回上一页

-(void)lastWeb{//翻页动效

CGPoint offSet =self.scrollView.contentOffset;if (offSet.x==0) {return;

}

offSet.x-=kWidth;

[self.scrollView setContentOffset:offSet animated:YES];//销毁不用的webView

[_webArray[_count] stopLoading];

[_webArray[_count] removeFromSuperview];//删除字典

[_webDict removeObjectForKey:_urlArray[_count]];

[_webArray removeObjectAtIndex:_count];

[_urlArray removeObjectAtIndex:_count];

_count--;

[self mutualOCwithJS];

}

这两条措施都有效降低内存损耗,同时保证了app页面跳转的平滑过渡,当然如果想要想原生app中的手势右划返回,我们这个也同样可以完成。

//滑动手势

- (void)handleSwipes:(UISwipeGestureRecognizer *)sender{if (sender.direction ==UISwipeGestureRecognizerDirectionRight) {

[self lastWeb];

}

}

当然,我只是提供我的一种思路,而且我们也是这样做的,可能还会有更好的思路,希望能多补充,共同进步。

原文:http://www.cnblogs.com/keynowu/p/5997698.html

h5 移动开发 html页面跳转,iosh5混合开发项目仿app页面跳转优化相关推荐

  1. vue项目某个APP页面实现手机物理按键返回、路由拦截、localStorage存取参数

    vue项目某个APP页面实现手机物理按键返回.路由拦截.localStorage存取参数 最近做个功能:在web系统里面嵌套两个app页面,当然APP页面在web系统上没有路由跳转,而是从另外系统扫码 ...

  2. kotlin与java混合开发_使用kotlin和Java混合开发Android项目爬坑记录

    使用kotlin和Java混合开发Android项目爬坑记录 不定期将开发过程中遇到的问题添加在此处,加深记忆. 主要内容包括但不限于java与kotlin语言的一些区别,以及在使用android-s ...

  3. list vue 删除后页面渲染_浅谈Vue项目实战(页面渲染+事件绑定)

    页面渲染 vue是不会去操作dom节点,是有数据去操控节点,在js文件数据都在data里 *js代码片* export default { data() { return { formInline: ...

  4. python语言开发平台_Go+Python双语言混合开发

    装饰器的实质是什么?或者说为什么装饰器要写2层嵌套函数,里层函数完全就已经实现了装饰的功能为什么不直接用里层函数名作为装饰器名称? 答:装饰器是要把原来的函数装饰成新的函数,并且返回这个函数本身的高阶 ...

  5. iOS开发常用(三方类库,工具,高仿APP,技术网站 ,快捷键 ,技术干货)

    一 . JSONModel  (三方类库会有更新,建议大家在线下载) http://pan.baidu.com/s/1i5ybP1z 二.AFNetworkiong http://pan.baidu. ...

  6. 分享iOS开发常用(三方类库,工具,高仿APP,实用网站)

    一 . JSONModel  (三方类库会有更新,建议大家在线下载) http://pan.baidu.com/s/1i5ybP1z 二.AFNetworkiong http://pan.baidu. ...

  7. 客户端相关知识学习(一)之混合开发,为什么要在App中使用H5页面以及应用场景、注意事项...

    混合开发 随着移动互联网的高速发展,常规的开发速度已经渐渐不能满足市场需求.原生H5混合开发应运而生,目前,市场上许多主流应用都有用到混合开发,例如支付宝.美团等.下面,结合我本人的开发经验,简单谈一 ...

  8. 58同城 Flutter 混合开发探索与实践

    点击"开发者技术前线",选择"星标????" 在看|星标|留言,  真爱 导语 本文主要介绍将Flutter应用到已有Native项目中混合开发遇到的问题及解决 ...

  9. Flutter 深入探索混合开发的技术演进

    关于 Flutter 混合 PlatformView 的实现已经介绍过两次,随着 5 月份谷歌 IO 的接近,新的 PlatformView 实现应该也会随之而来,本次就从头到尾来一个详细的关于 Pl ...

最新文章

  1. setAdapter(adapter)空指针nullPointer 解决办法
  2. Uuntu 20.04 install OpenLDAP
  3. 使用iPhone相机和OpenCV来完成3D重建(第三部分)
  4. Java中的垃圾回收与对象生命周期
  5. nginx 上传文件漏洞_文件上传及解析漏洞
  6. boost helloworlld
  7. spring-cloud-dependencies的Edgware.RELEASE版本问题
  8. 算法与数据结构大系列 - NO.1 - 插入排序 1
  9. 设计模式03-工厂方法
  10. oracle显示更新条数的函数,ORACLE学习笔记-添加更新数据函数篇
  11. 发改委:扩大优质民营企业债券发行规模
  12. oracle如何储存超长汉子_厦门到惠州整车运输超长超宽超重运输
  13. 系统分析师和系统架构设计师的主要区别是什么?
  14. javashop源码百度云,java电商系统源码分享,Javashop多用户商城源码
  15. 笔记本BIOS启动项中找不到新装的固态硬盘解决
  16. 武汉大学2018计算机考研拟录取名单,【完整版】2018年武汉大学硕士研究生考试拟录取名单...
  17. HTML5期末大作业:个人生活网站设计——简单的个人生活记录介绍网页模板HTML+CSS+JavaScript 生活网页HTML代码 学生网页课程设计期末作业下载 动漫大学生网页设计制作成
  18. 使用Zack.EventBus 对rabbitMQ简化操作
  19. java编程实现;猜单词游戏
  20. 【XJTUSE 计算机组成与结构笔记】第六章 外存

热门文章

  1. Flink 多流转换
  2. 「PAT乙级真题解析」Basic Level 1033 旧键盘打字 (问题分析+完整步骤+伪代码描述+提交通过代码)
  3. Nginx 动静分离 -02
  4. 自制图像标注软件 —— 支持mask-rcnn等算法
  5. 数据结构与算法之美笔记——基础篇(下):图、字符串匹配算法(BF 算法和 RK 算法、BM 算法和 KMP 算法 、Trie 树和 AC 自动机)
  6. mysql数据库asc_mysql数据库
  7. 【懒懒的Python学习笔记八】
  8. iOS 图像选取器UIImagePickerController
  9. 旧电脑升级Win11
  10. memcached php mysql_PHP: memcached