iOS -- 透明H5(webView)效果的实现

前几天有一个完全透明的webView加载H5页面的效果的实现,就相当于是一个半透明的遮罩层,上面有一个不透明的图片,一般原生的带遮罩层的弹框会采用这种方式,如果是原生代码实现,就简单的多了,视图的叠加就可以搞定,但如果整个页面包括遮罩层都要用webView加载H5来实现的话,就会有点儿复杂,这一效果还是花费了好一番功夫,在实际的开发过程中,发现了webView从未接触过的奇妙的一面:_UIWebViewScrollView、UIWebBrowserView。

起初,是要设置webView的颜色和透明度(不是整体的alpha),但是发现无论怎么操作都不可以,中间的那部分区域也无法改变颜色;于是使用下面递归的方式输出了WebView中所有继承于UIView的子视图;

    func getNameSubViews(theView:UIView) {

        for view in theView.subviews {

            if view.isKindOfClass(UIView){

                let name = NSString.init(UTF8String: object_getClassName(view))

                print("WebView 的 子视图 : \(name)")

            }

            getNameSubViews(view)

        }

    }

输出结果:

WebView 的子视图 : Optional(_UIWebViewScrollView)

WebView 的子视图 : Optional(UIWebBrowserView)

结果就发现了两个类:_UIWebViewScrollView、UIWebBrowserView;这是两个从来没见过的类,但是从名字也大致能看出来在什么位置;但是我很奇怪的是为什么没有UIScrollView,或者还是这个_UIWebViewScrollView事实上和我们直接调用的webView.scrollView有着什么联系,但是webView的scrollView属性继承于UIScrollView,UIScrollView继承于UIView,中间的继承关系中也并未出现_UIWebViewScrollView;这也是我疑惑的地方;然后我在for循环前面加上了这三行代码,

        let scroll:UIScrollView = UIScrollView() //UIView
        let name2 = NSString.init(UTF8String: object_getClassName(scroll))
        print("UIScrollView取到的名称 : \(name2)")

输出结果:

UIScrollView取到的名称 : Optional(UIScrollView) 

输出的是UIScrollView,这说明for循环中打印出来的_UIWebViewScrollView并不是webView中类型为UIScrollView的属性scrollView中的,而是构成webView的一个子视图;

接下来,为了搞明白他这两个的图层关系,我把递归方法做了一点儿改进;

    func getNameSubViews(theView:UIView,index:Int) {
        print("\(index) 开始")
        for view in theView.subviews {
            if view.isKindOfClass(UIView){
                let name = NSString.init(UTF8String: object_getClassName(view))
                print("WebView 的 子视图 : \(name)")
            }
            getNameSubViews(view,index: index+1)
        }
        print("\(index) 结束")
    }

输出结果:

1 开始

WebView 的子视图 : Optional(_UIWebViewScrollView)

2 开始

WebView 的子视图 : Optional(UIWebBrowserView)

3 开始

3 结束

2 结束

1 结束

这个结果说明了UIWebBrowserView是在_UIWebViewScrollView上面的一个子视图;如果传入参数是webView.scrollView而不是webView,就会发现只有UIWebBrowserView输出了,也就是说事实上UIWebBrowserView是webView的属性scrollView上的一个子视图,但事实上,我还是在疑惑为什么scrollView没有输出呢,这个留待之后深入研究了再进行解答吧;

其实还有一个办法也可以清楚的看到图层分布,运行如下代码:

    func changeColorSubViews(theView:UIView) {

        for view in theView.subviews {
            if view.isKindOfClass(UIView){
                let name = NSString.init(UTF8String: object_getClassName(view))
                if name == "_UIWebViewScrollView"{
                    view.backgroundColor = UIColor.redColor()
                    print("WebView 的 红色子视图 : \(name)")

                }else if name == "UIWebBrowserView"{
                    view.backgroundColor = UIColor.greenColor()
                    print("WebView 的 绿色子视图 : \(name)")
                }else{
                    view.backgroundColor = UIColor.blueColor()
                    print("WebView 的 蓝色子视图 : \(name)")

                }
            }
            changeColorSubViews(view)
        }
    }

运行出界面之后去Debug View Hierarchy里面就可以看到具体的图层关系了;

这个关系理清楚之后就知道为什么设置不了webView的clearColor了,只要使用递归设置这两个子视图的背景色为clearColor,同时,设置

webView.opaque = false就OK了;当然,主要的一点还有加载的H5页面也要直接使用div做成透明的,没有背景body.

具体的webView深层次的架构体系,等周末研究研究再来总结。

时间: 2024-10-12 15:04:54

iOS -- 透明H5(webView)效果的实现的相关文章

JavaScript:浅谈iOS与H5的交互-JavaScriptCore框架

JavaScript:浅谈iOS与H5的交互-JavaScriptCore框架 前言 小的作为一个iOS程序猿,可能研究JavaScript以及H5相关的知识并不是为了真正的要去转行做这一方面,其实更多的为了要研究OC中的JavaScriptCore框架,JavaScriptCore框架主要是用来实现iOS与H5的交互.当然了,最早我曾经写过iOS浅谈webView的JS一种用法.(去掉web显示页的广告),这种算得上最简单的iOS与H5的交互了.现在混合编程越来越多,H5的相对讲多,所以研究J

iOS与H5界面JSBridge交互Demo

iOS与H5界面JSBridge交互Demo 最近公司需要加活动和新闻模块, boss看同样的设计稿, 我们iOS做一遍, 安卓做一遍, 小程序又做一遍; 所以决定用H5页面. 但我们Native不仅仅加载URL就行, 还需要跟H5有交互, 安卓大哥跟我慢慢填坑- 我用了一个library(GCWebviewJSBridge-iOS), github网址:github.com/wheying/GCWebviewJSBridge-iOS 他的Demo不太容易看得懂, 看得我一脸懵逼, 我写了一个简

H5(WebView)跳Native(UIView)

做网络ios应用难免要用到UIWebViewController,直接嵌入一个html页面.这种native+web的方式再很多app中都有应用,app store就是一个,另外如淘宝iPhone客户端的支付,口碑网iPhone客户端的团购内容,等等.这种实现方式,某种程度上牺牲了一些体验,但大大提高了开发效率,而且降低了升级成本.这种方式非常适合实现一个仍处在发展初期的功能. 但使用native+web的方式有一个最大的问题,就是从WebView向NativeView的跳转.由于进入WebVi

IOS中文字体斜体效果

/* 该代码用于解决在IOS开发,中文字体不能使用斜体的问题 对该控件进行旋转,因此如果控件有背景颜色/图片,也会跟着旋转 可将该控件设置背景透明,于Label下方再建一个有背景颜色的Frame相同的Label */ UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 200, 40)]; lbl.backgroundColor = [UIColor clearColor]; lbl.text = @"中文斜体&q

iOS开发之WebView

做iOS的应用也有一段时间了,在之前的demo中一直没有机会用到WebView,今天就查缺补漏一下,使用一下WebView.最早接触WebView是在Android中接触的,iOS中的WebView的用法也是挺简单的.本篇博客没有什么高深的技术,只是对webView的应用.从字面意思可以看出WebView就是用来加载网页的视图,和手机上的浏览器类似. 1.之前用storyboard拖控件时只是看着WebView在哪里静静的躺着(如下图所示),一直没有用过,如果想使用的话也很简单,就是把web v

iOS与H5交互的方案

iOS与H5交互的方案 纵观所有iOS与H5交互的方案,有以下几种: 第一种:有很多的app直接使用在webview的代理中通过拦截的方式与native进行交互,通常是通过拦截url scheme判断是否是我们需要拦截处理的url及其所对应的要处理的功能是什么.任意版本都支持. 第二种:iOS7之后出了JavaScriptCore.framework用于与JS交互,但是不支持iOS6,对于还需要支持iOS6的app,就不能考虑这个了.若需要了解,看最后的推荐阅读. 第三种:WebViewJava

iOS与H5交互

前提:在oc控制器中加载UIWebView,设置代理,遵守UIWebViewDelegate协议. 一.iOS调用JS方法 通过iOS调用JS代码实现起来比较方便直接调用UIWebView的方法- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script; 1.查询标签 // 查询标签      NSString *str = @"var word = document.getElementByI

iOS与H5交互遇到的坑

之前的博客写过使用<JavaScriptCore/JavaScriptCore.h>类来实现与H5的交互,但是在项目中还是遇到了一些不得不踩的坑.在这里将我遇到的问题以及参考网上几位大神的解决方案列举出来,如果有更好的办法,欢迎讨论指正.在阅读本博客前,请参阅我之前的<iOS与H5交互>. 一.在webView中加载H5界面,在此webView中的H5一级界面可以轻松实现oc与js方法互调,但如果在H5界面上进入二级界面,在二级界面中再使用之前方法来交互就会失效.如图:左图为H5一

ios嵌套H5页面,出现的小bug;

ios嵌套H5页面,点击数字时就会弹出打电话的功能:解决方法: 在head标签中添加: <meta name="format-detection" content="telephone=no"> ios嵌套H5页面,只要碰到页面,就会使input获取焦点,调取ios键盘,解决方法:在页面上添加js如下: $("body")[0].addEventListener("touchstart",function(){ d