当前位置: 首页 > 编程日记 > 正文

iOS 走近商城 APP(三 WKWebView 商品规格选择框架封装)

开篇

忽然发现最近也只有值班才能写东西了,中间更新了两篇其他的断了下商城相关的文章,仔细看了看之前觉得干货太少,今天写点实际的吧,闲说少说商城相关的更新今天继续吧,哈哈。前两篇文章:iOS走近商城APP(一) ,iOS走近商城APP(二 购物车常用控件)(今天值班整座大楼一如既往的静悄悄,胆小怪我咯-_-、)。

主要内容

  • 使用WKWebView替换Webview
    WKWebView的html网页的加载方法
    WKWebView显示网页的base页面的封装,点击页面的拦截方法
    商品详情页页面的自适应布局
  • 商品规格选择框架
    基于内容宽度自适应的框架封装,优化之前介绍的第三方框架带来的问题

使用WKWebView替换Webview

在商城中,使用html网页做展示页面,商品详情,活动页面再常见不过,往往有许多,但是
Webview大量使用会存在内存暴增,如果用WKWebView就能大大减少内存,下面就具体介绍一下使用过程,至于WKWebView的原理以及基本的代理这里就不一一列举了,实战出发,哈哈。

  • 活动页Webview的替换

签到页面.png


如图我们点击立即签到和立即签钱,会触发不同的点击事件,当然在许多别的页面,我们点击网页上的内容还要跳转到软件本身的界面,我们的怎么处理他呢?在老的Webview中我们遵循UIWebViewDelegate的代理方法,然后处理方式如下

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
}

拦截点击事件,然后再方法中做出处理

  NSString* urlString=[[request URL] absoluteString];NSLog(@"%@",urlString);NSArray* actionArray=[urlString componentsSeparatedByString:@"-"];for (NSString* actionStr in actionArray) {if ([actionStr isEqualToString:@"SignNew.StartSign"]) {//跳转签到页面-action[webView stopLoading];[self gotoSignIn];}else if([actionStr isEqualToString:@"Task.TaskDetail"]){//跳转界面....代码原理同上}else if([actionStr isEqualToString:@"Task.TaskList"]){//跳转页面...代码原理同上}

原理就是我们截取到点击事件然后根据后台返回的网址进行处理,根据网址中不同的字段跳转到我们想要跳转的页面。
在WKWebView中我们的处理方式如下遵循WKNavigationDelegate代理方法,然后调用方法

#pragma mark - WKWebviewDelegate
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
}

在这个方法中进行上述的处理,

   NSString *urlString = [navigationAction.request.URL.absoluteString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];NSLog(@"%@",urlString);NSArray* actionArray=[urlString componentsSeparatedByString:@"-"];for (NSString* actionStr in actionArray) {if ([actionStr isEqualToString:@"SignNew.StartSign"]) {//跳转页面-action[webView stopLoading];...}else if([actionStr isEqualToString:@"Task.TaskDetail"]){//跳转界面...}

在处理完跳转逻辑之后记得加上这句代码

    decisionHandler(WKNavigationActionPolicyAllow);//允许跳转

下面再放两个加载时的协议方法

// 页面加载完成之后调用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.05 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[SVProgressHUD dismiss];});
}
// 页面加载失败时调用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation
{dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.05 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[SVProgressHUD dismiss];});
}
  • WKWebView 商品详情页的自适应布局

商品详情页.png


如图所示,商品详情的时候我们要根据每个商品详情的不同来对他进行自适应的图文布局,他并不像我们的活动页面那么简单,由于数量比较多,内容不固定因此我们在加载页面的时候要做处理(但是这个一般就不需要做点击交互处理了,哈哈),代码如下

-(WKWebView *)webView{if (_webView==nil) {NSString *jScript = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:NO];WKUserContentController *wkUController = [[WKUserContentController alloc] init];[wkUController addUserScript:wkUScript];WKWebViewConfiguration *wkWebConfig = [[WKWebViewConfiguration alloc] init];wkWebConfig.userContentController = wkUController;_webView=[[WKWebView alloc] initWithFrame:CGRectZero configuration:wkWebConfig];_webView.navigationDelegate = self;NSURLRequest* request=[NSURLRequest requestWithURL:[NSURL URLWithString:url]];[_webView loadRequest:request];}return _webView;
}

加入一段JS代码对页面进行布局处理。

商品详情的框架封装

在iOS走近商城APP(二 购物车常用控件)文章中,我们介绍了一个商品详情布局的控件,虽然有优点,但是也有他的局限性,因为如果在商品规格比较单一,且长度较短或者固定的时候,是很美观的,但是如果我们想要根据不同的规格长度进行自适应,问题就来了,就出现了商品显示不完整的情况,今天放一个在那个版本的基础上自己又重新封装过的框架吧。效果图如下


详情页布局.png


主要的操作就是优化了根据规格不同,对标签长度以及换行的计算标准更加的趋向于实际应用。
标签的自适应计算主要代码如下(具体可以看git中的源码):
首先创建系统的函数如下,其效果类似于for in遍历

- (void)enumerateObjectsUsingBlock:(void (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);

然后再函数中的处理

  [_filterData.elements enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {Btnx += btnGap;CGFloat btnWidth = [self WidthWithString:obj fontSize:14 height:BtnHeight];btnWidth += 10;//让文字两端留出间距if(btnWidth<minBtnLength)btnWidth = minBtnLength;if(btnWidth>maxBtnLength)btnWidth = maxBtnLength;if(Btnx + btnWidth > oneLineBtnWidtnLimit){BtnlineNum ++;//长度超出换到下一行Btnx = btnGap;}UIButton *button = [[UIButton alloc] init];//Y坐标CGFloat height = btnGapY+ (BtnlineNum*(BtnHeight+btnGapY));// NSLog(@"Y坐标-------------%f",height);button.frame = CGRectMake(Btnx, height, btnWidth,BtnHeight );//此处省略按钮的具体属性的设置[button addTarget:self action:@selector(buttonSelected:) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:button]; [_buttons addObject:button]; Btnx = button.frame.origin.x + button.frame.size.width + btnGap; totalHeight = height; //行高为最大的Y坐标加高度

下面放上一个详细举例的gif效果图。


介绍图2.gif


代码传送门GSFilterView,有用的可以点个星哦。

后记

惯例闲扯时间,哈哈,下一篇将写一下runloop在订单列表中的实际应用,获取通讯录手机号码以及iOS9与iOS8下的处理等,督促自己一波哈哈。

相关文章:

c语言如何不产生僵尸进程,第三章 九析带你处理 zombie(defunct) 进程

目录1 前言2 僵尸进程2.1 进程简介2.2 僵尸进程例子2.3 僵尸进程危害3 处理僵尸进程3.1 kill 命令3.2 kill 父进程3.3 reboot3.4 magic sysrq key 方法1 前言在 centos7 跑 Docker 和 k8s 时&#xff0c;偶尔会出现 systemctl 失效的情况&#xff0c;现象如下&#xff1a;Faile…

音视频开发学习笔记

http://www.jianshu.com/notebooks/6409162/top

VS2010 MFC中改变static字体颜色、大小、背景颜色(自定义类),及手动关联变量的方法...

在MFC的Dialog工程中生成一个CStatic的自定义类&#xff0c;类名例如为&#xff1a;CColorStatic 定义必要的变量&#xff1a; protected:COLORREF m_crText; // 字体颜色COLORREF m_crBackColor; // 背景颜色HBRUSH m_hBrush; // 画刷LOGFONT m_lf; // 字体…

android 上传字符串,Android中发送Http请求(包括文件上传、servlet接收)的实例代码...

/*** 通过拼接的方式构造请求内容&#xff0c;实现参数传输以及文件传输* param actionUrl* param params* param files* return* throws IOException*/public static String post(String actionUrl, Map params,Map files) throws IOException {String BOUNDARY java.util.UU…

JavaScript最全编码规范

转载: JavaScript最全编码规范 类型 ●基本类型&#xff1a;访问基本类型时&#xff0c;应该直接操作类型值 ●string ●number ●boolean ●null ●undefined var foo 1; var bar foo; bar 9; console.log(foo, bar); // > 1, 9 ●复合类型&#xff1a;访问复合类型时&a…

源码推荐:collectionView拖拽,仿凤凰FM iOS 局部监听键盘再也不会挡住输入框

UICollectionView拖拽移动单元以及本地保存&#xff08;上传者&#xff1a;dengqi&#xff09; UICollectionView拖拽移动单元以及本地保存&#xff0c;可以保存你上次移动的位置。 仿映客直播导航条&#xff08;上传者&#xff1a;Coolcool&#xff09; 仿映客直播自定义TabBa…

采集练习(一) php 获得全国的小学(数据来自腾讯朋友网)

注&#xff1a;发现腾讯朋友网已经改版&#xff0c;部分参数需要自己获得修改 &#xff01;&#xff01;&#xff01; 年前有个需求获得某省的小学数据&#xff0c;分析了下朋友网的小学学校发现可以获得相关数据。 如获得 湖南省郴州市宜章县的全部小学 发现网页请求的地址…

android 模板方法模式,安卓设计模式(七)模板方法模式

模板方法模式用于固定相关操作的执行流程,将具体实现延迟到子类中该系列其他文章:定义: 定义一个操作中算法的框架,而降一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.使用场景:代码重构时,模板方法是经常被用到的,将固定部分提取到父…

solr单机版的搭建

一、solr单机版的搭建 1.运行环境 solr 需要运行在一个Servlet容器中&#xff0c;Solr4.10.3要求jdk使用1.7以上&#xff0c;Solr默认提供Jetty&#xff08;ja&#xff09;&#xff0c;本教va写的Servlet容器程使用Tocmat作为Servlet容器&#xff0c;环境如下&#xff1a; Solr…

android5.0后新特性修改标题头,Android5.0中Material Design的新特性

Material Design简介Material Design是谷歌新的设计语言&#xff0c;谷歌希望寄由此来统一各种平台上的用户体验&#xff0c;Material Design的特点是干净的排版和简单的布局&#xff0c;以此来突出内容。Material Design对排版、材质、配色、光效、间距、文字大小、交互方式、…

MFCard:易用的信用卡支付集成类库

原文链接&#xff1a;https://github.com/MobileFirstInc/MFCardMFCard&#xff1a;易用的信用卡支付集成类库。# 为开源点赞# —— 由 SwiftLanguage 分享MFCard is an awesome looking Credit Card input & validation control. Written in Swift 3. Demo Usage First St…

Castle ActiveRecord学习(四)延迟加载、分页查询、where条件

一、延迟加载 //用户发布的主题&#xff0c;一对多&#xff1b;Table&#xff1a;外键表&#xff1b;ColumnKey&#xff1a;外键&#xff1b;Lazy&#xff1a;延迟加载&#xff1b;Cascade&#xff1a;级联操作&#xff08;级联删除&#xff09;[HasMany(typeof(ThemeInfo), Ta…

系统吞吐量(TPS)、用户并发量、性能测试概念和公式(转载)

原文地址&#xff1a;http://www.ha97.com/5095.html PS&#xff1a;下面是性能测试的主要概念和计算公式&#xff0c;记录下&#xff1a; 一&#xff0e;系统吞度量要素&#xff1a; 一个系统的吞度量&#xff08;承压能力&#xff09;与request对CPU的消耗、外部接口、IO等等…

android layout后还原位置,Android图片框架photoview如何记住所有状态并还原,包括缩放度,缩放后的移动的距离等等...

Android图片框架photoview如何记住状态并还原&#xff0c;包括缩放度&#xff0c;缩放后的移动的距离等等,尝试了好多方法都没有作用。private void generateImages() {for (int i 0; i < imagesEntities.size(); i) {// PhotoViewAttacher attacher;final ImagesEntity en…

Shiro安全登录框架

环境准备 本文使用Maven构建&#xff0c;因此需要一点Maven知识。首先准备环境依赖&#xff1a; Java代码 <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <…

iOS自动签名打包(xcodebuild)----常用

iOS自动打包主要用xcodebuild命令, 在终端输入xcodebuild --help可以查看xcodebuild的参数。 xcodebuild具体语法&#xff1a; 无workspace的工程 xcodebuild [-project name.xcodeproj] [[-target targetname] … | -alltargets] [-configuration configurationname] [-sdk [s…

设计模式解析(五)——几种设计模式之Facade和Adapter

由于个人时间原因&#xff0c;无法详细描述这些模式&#xff0c;暂且记录下来以后慢慢补充详细。 Facade模式 Facade模式&#xff1a;关键特征 意图希望简化原有系统的使用方式。需要定义自己的接口。问题只需使用某个复杂系统的子集&#xff0c;或者&#xff0c;需要以一种特殊…

android level list,Android Drawable (levle List selector layer List)

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;管理大量备选可绘制对象的可绘制对象&#xff0c;每个可绘制对象都分配有最大的备选数量。使用 setLevel() 设置可绘制对象的级别值会加载级别列表中 android:maxL…

人脸检测流程及正负样本下载

源地址&#xff1a;http://www.thinkface.cn/thread-146-1-4.html 人脸检测做训练当然可以用OpenCV训练好的xml&#xff0c;但是岂止于此。我们也要动手做&#xff01;~首先是样本的选取。样本的选取很重要&#xff0c;找了很久才发现几个靠谱的。人脸样本&#xff1a;http://w…

源码推荐:仿写映客直播 ,快速切换主题 ,星星评分控件,表格样式,可以横向移动的表格, 仿微信键盘-

仿写映客直播&#xff08;上传者&#xff1a;五仁月饼&#xff09; 工作之余写的,基于IJKPlayer播放&#xff0c;对内存做了处理。目前已完成直播列表和直播间的搭建&#xff0c;后续还会慢慢完善。 项目地址 publishImageAndVideoAnsRecord&#xff08;上传者&#xff1a;zlj5…

希尔排序——算法系列

希尔排序&#xff1a; 插入排序的升级版&#xff0c;主要采用了分组的策略&#xff0c;采用逐渐减小步长来控制分组的大小&#xff0c;各组内采用插入排序&#xff0c;当步长减小为1的时候&#xff0c;大部分数据都已经有序&#xff0c;所以较插入排序优化了许多。 代码&#x…

android 请求方式有哪些,Android中的几种网络请求方式详解

Android应用经常会和服务器端交互&#xff0c;这就需要手机客户端发送网络请求&#xff0c;下面整理四种常用网络请求方式。java.net包中的HttpURLConnection类Get方式&#xff1a;// Get方式请求public static void requestByGet() throws Exception {String path "http…

Sqlserver的触发器的简单使用

1&#xff0c;触发器有两种 &#xff08;1&#xff09;After触发器&#xff08;之后触发&#xff09; 触发器有个好处&#xff1a;就是你之前有过什么操作他会将你的操作的数据信息完整的保存下来&#xff0c;比如你删过什么信息&#xff0c;如果用触发器&#xff0c;那么删除后…

网络协议OSI、TCP/IP协议、Socket套接字和第三方AsyncSock的使用等解析

一、网络协议定义 1.OSI参考模型:全称(Open System Interconnection), 开放式系统互联参考模型。是一个逻辑上的定义&#xff0c;一个规范&#xff0c;它把网络协议从逻辑上分为七层&#xff0c;只要目的是为解决异种网络互连时所遇到的兼容性问题&#xff0c;其最主要的功能是…

Win8之快速关机

还在纠结如何关机吗&#xff1f;现在教你几招 1、 AltF4快捷键&#xff0c;Windows桌面下按AltF4即可弹出关机菜单&#xff08;保证无任何程序处于被选中状态&#xff0c;可以点击任务栏最右侧 来回到桌面&#xff0c;这时就没问题了&#xff09; 现在怎么关机就不用教了吧。 2…

多键开关 android8.0,手机桌面多键开关(SwitchPro Widget )

7键开关SwitchPro Widget 是款主屏幕窗口小部件工具&#xff0c;可用于开启/关闭多种系统功能&#xff0c;支持多种自定义设置&#xff0c;比原生的电量控制开关好用很多。7键开关SwitchPro Widget并非只有7个按键开关&#xff0c;而是有很多的意思&#xff0c;最多可以设置十几…

程序员取悦女票的正确姿势---Tip1(iOS美容篇)

前言 女孩子都喜欢用美图工具进行图片美容&#xff0c;近来无事时&#xff0c;特意为某人写了个自定义图片滤镜生成器&#xff0c;安装到手机即可完成自定义滤镜渲染照片。app独一无二&#xff0c;虽简亦繁。 JH定律&#xff1a; 魔镜&#xff1a;最漂亮的女人是你老婆 魔镜&am…

MySQL的安装配置(win7 64-bit)

MySQL的安装配置(win7 64-bit) 转&#xff0c;整理。 MySQL 版本是 mysql-noinstall-5.1.66-winx64.zip&#xff08;免安装版&#xff09; mysql-workbench-gpl-5.2.44-win32.msi mysql-connector-java-5.1.22 mysql 配置数据库编码为utf-8&#xff08;my.ini中指定&#xff09…

Sourse Insight使用教程及常见的问题解决办法

1、下载安装 2、创建项目new project(注意不是file-->new ),而是project-->new project,输入项目名称和密码. 3、添加文件&#xff0c;其实就是将你的整个项目文件添加到project中。 4、close就可以打开了。 具体参考道客巴巴一篇文章&#xff1a;Source_Insight教程及技…

android surface 平板,Surface平板能升级安卓4.0吗

Surface平板电脑暂时不能升级安卓4.0。Surface平板电脑x86架构的版本搭载了英特尔Core i5 Ivy Bridge双核处理器&#xff0c;而ARM架构的版本搭载了Nvidia代工的ARM单核处理器。Surface平板电脑采用镁合金机身&#xff0c;具有x86和ARM架构两个版本&#xff0c;x86架构的版本屏…