文档章节

iOS-UIWebView添加头部和尾部

麦兜卖鱼丸
 麦兜卖鱼丸
发布于 2016/06/07 17:18
字数 678
阅读 486
收藏 3

前言

项目中使用UIWebView显示本地或者是服务器上的页面很容易,但是仅限于显示页面,可控性并不高,如果有需要在头部和尾部加上原生的view,显示部分信息相对于全部使用UIWebView来说会好蛮多,下面开始实现添加逻辑;

 

(一)在UIWebView的子控件Scrollview中添加头部以及尾部,添加头部相对于来说简单,先设置Scrollview的contentInset属性,UIEdgeInsetsMake(50, 0, 0, 0)即显示内容下移50;然后添加一个自定义view,frame等于CGRectMake(0, -50, self.view.frame.size.width, 50)即可。尾部的话,会复杂点,主要是UIWebView的contentSize会变,所以首先要知道contentSize或者说是内容的高度,方法是使用KVO监听UISCrollview的contentSize属性,这个方法我也是从网上找到的,原来我的想法是,通过UIScrollView的- (void)scrollViewDidScroll:(UIScrollView *)scrollView,根据下拉的offsety来控制尾部view的显示,但是后面发现不可行,所以才找到了这个KVO的方法;下面看代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    self.webss = [[UIWebView alloc] initWithFrame:self.view.bounds];
    self.webss.scrollView.contentInset = UIEdgeInsetsMake(50, 0, 0, 0);
    [self.webss loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]]];
    self.webss.backgroundColor = [UIColor whiteColor];
    self.webss.opaque = NO;
    
    UIImageView *headerView = [[UIImageView alloc] initWithFrame:CGRectMake(0, -50, self.view.frame.size.width, 50)];
    headerView.userInteractionEnabled = YES;
    headerView.backgroundColor = [UIColor redColor];
    
    [self.webss.scrollView addSubview:headerView];
    [self.view addSubview:_webss];

}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self addObserverForWebViewContentSize];
}
- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self removeObserverForWebViewContentSize];
}

- (void)addObserverForWebViewContentSize
{
    [self.webss.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
}
- (void)removeObserverForWebViewContentSize
{
    [self.webss.scrollView removeObserver:self forKeyPath:@"contentSize"];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
    [self test];
}


//设置footerView,并计算合适位置;
- (void)test
{
    //取消监听,因为这里会调整contentSize,避免无限递归
    [self removeObserverForWebViewContentSize];
    
    UIView *viewss = [self.view viewWithTag:99999];
    [viewss removeFromSuperview];
    
    CGSize contentSize = self.webss.scrollView.contentSize;
    UIView *vi = [[UIView alloc] init];
    vi.backgroundColor = [UIColor blueColor];
    vi.userInteractionEnabled = YES;
    vi.tag = 99999;
    vi.frame = CGRectMake(0, contentSize.height, self.view.frame.size.width, 150);
    
    [self.webss.scrollView addSubview:vi];
    self.webss.scrollView.contentSize = CGSizeMake(contentSize.width, contentSize.height + 150);
    
    //重新监听
    [self addObserverForWebViewContentSize];
}

以上的代码是实现的关键代码,KVO机制我就不说了,还有一个关键的地方就是UIView *viewss = [self.view viewWithTag:99999];[viewss removeFromSuperview];两句代码,contentSize有可能变,有可能不变;只能保留通过监听到的最后一次contentSize计算出来的位置,否则尾部自定义的view会显示不正确。

 

(二)改进demo的一些想法;

在下拉UIwebview的过程中,也会显示灰色的背景色,相当的难看;基于上面的demo,已经实现了头部与尾部的添加,把头部的高度与下拉的距离同步起来,在这个UIScrollView的- (void)scrollViewDidScroll:(UIScrollView *)scrollView方法中,计算出offsety,然后头部自定义view的frame等于CGRectMake(0, -50-offsety, self.view.frame.size.width, 50+offsety),应该就可以达到效果了。

© 著作权归作者所有

共有 人打赏支持
麦兜卖鱼丸
粉丝 12
博文 69
码字总数 69333
作品 0
桂林
iOS工程师
私信 提问
iOS与JS交互之UIWebView-协议拦截

级别:★★☆☆☆ 标签:「iOS与JS交互」「UIWebView与JS交互」「UIWebView拦截协议」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),J...

QiShare
2018/08/28
0
0
iOS与JS交互之UIWebView-JSExport协议

级别:★★☆☆☆ 标签:「iOS与JS交互」「UIWebView与JS交互」「JSExport」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),JS指前端(不...

QiShare
2018/08/31
0
0
iOS与JS交互之UIWebView-JavaScriptCore框架

级别:★★☆☆☆ 标签:「iOS与JS交互」「UIWebView与JS交互」「JavaScriptCore」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),JS指前...

QiShare
2018/08/30
0
0
iOS与JS交互之WKWebView-WKScriptMessageHandler协议

级别:★★☆☆☆ 标签:「iOS与JS交互」「WKWebView与JS交互」「WKJSMessageHandler」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),J...

QiShare
2018/09/02
0
0
iOS与JS交互之WKWebView-WKUIDelegate协议

级别:★★☆☆☆ 标签:「iOS与JS交互」「WKWebView与JS交互」「WKUIDelegate」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),JS指前端...

QiShare
2018/09/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ehcache

简单介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。Ehcache是一种广泛使用的开 源Java分布式缓存。主要面向通用缓存,Java EE和轻量...

大笨象会跳舞吧
19分钟前
0
0
Android服务2 BindService

MainActivity { class MyService extends Service { public void onCreate() {} public IBinder onBind(Intent intent) { //return new Binder(); retutn new MyBinder(); } public boolean ......

Coding缘
57分钟前
0
0
所有和Java中代理有关的知识点都汇集于此,速进学干货。

对于每一个Java开发来说,代理这个词或多或少都会听说过。你可能听到过的有代理模式、动态代理、反向代理等。那么,到底什么是代理,这么多代理又有什么区别呢。本文就来简要分析一下。 代理...

Java填坑路
今天
1
0
镜像即代码:基于Packer构建阿里云镜像

什么是Packer Packer是HashiCorp推出的一款工具,旨在提供简易的方式自动化构建镜像。通过Packer,你只需要在配置文件中指明镜像构建所需的基本信息及期望安装到镜像中的软件及配置,即可通过...

迷你芊宝宝
今天
1
0
好程序员前端教程之JavaScript闭包和匿名函数的关系详解

好程序员前端教程之JavaScript闭包和匿名函数的关系详解 本文讲的是关于JavaScript闭包和匿名函数两者之间的关系,从匿名函数概念到立即执行函数,最后到闭包。下面一起来看看文章分析,希望...

好程序员IT
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部