是否可以在 Swift 中交错 WebView 和 CALayerViews

2024-06-19

我有一个充当多个 CAShapeLayers 容器的视图。它们包含在屏幕上形成组合的贝塞尔曲线,用户可以通过不同的方式管理线宽、颜色、形状填充、不透明度等。

我想通过占据相同容器的 WebView 引入文本。诀窍是,理想情况下我希望能够控制每个元素相对于其他元素的容器中的 zPosition。

WebView 是否可以以与该容器中的 CAShapeLayers 共享 zPosition 范围的方式位于容器中?


情侣选项...

  1. 使用 html Canvas 并在页面内容本身中绘制形状。
  2. 创建一个clearWeb 视图并在 Web 视图下/顶部的视图中绘制形状。
  3. 将子图层添加到 Web 视图的图层(仍然需要实现clear html 以将图层放置在 html 内容下)。

以下是选项 3 的简单示例:

class ViewController: UIViewController {
    
    var webView: WKWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        webView = WKWebView()
        webView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(webView)
        
        let g = view.safeAreaLayoutGuide
        NSLayoutConstraint.activate([
            webView.topAnchor.constraint(equalTo: g.topAnchor, constant: 20.0),
            webView.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 20.0),
            webView.trailingAnchor.constraint(equalTo: g.trailingAnchor, constant: -20.0),
            webView.bottomAnchor.constraint(equalTo: g.bottomAnchor, constant: -20.0),
        ])
        
        // this will allow us to see the shape layers
        //  if we put them *behind* the html content
        webView.isOpaque = false
        webView.backgroundColor = .clear
        webView.scrollView.backgroundColor = .clear
        
        // webView will be clear, so let's give it a border
        // so we can see the frame
        webView.layer.borderWidth = 1
        webView.layer.borderColor = UIColor.black.cgColor
        
        webView.loadHTMLString(html, baseURL: nil)
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        // we'll create 4 CAShapeLayers
        //  with oval paths
        //  each 1/4 the height of the webView
        //  overlapping a little
        var y: CGFloat = 12.0
        let yInc: CGFloat = (webView.bounds.height - 32.0) * 0.25
        var pathRect: CGRect = webView.bounds.insetBy(dx: 20.0, dy: 0.0)
        pathRect.size.height *= 0.25
        
        let colors: [UIColor] = [
            .systemRed, .systemGreen, .systemBlue, .cyan
        ]
        
        for (i, c) in colors.enumerated() {
            
            // oval CAShapeLayer with
            //  solid color thick stroke
            //  50% transparent color fill
            let cLayer = CAShapeLayer()
            cLayer.lineWidth = 8
            cLayer.strokeColor = c.cgColor
            cLayer.fillColor = c.withAlphaComponent(0.5).cgColor
            cLayer.path = UIBezierPath(ovalIn: pathRect.offsetBy(dx: 0.0, dy: y)).cgPath
            
            // add shape layers to the webView's layer
            //  shape layers will NOT scroll
            var targetLayer = webView.layer
            
            // or, add shape layers to the webView's scrollView's layer
            //  shape layers WILL scroll
            //targetLayer = webView.scrollView.layer
            
            if i < 2 {
                // insert the first two layers *behind* the web page content
                targetLayer.insertSublayer(cLayer, at: UInt32(i))
            } else {
                // add the second two layer *on top of* the web page content
                targetLayer.addSublayer(cLayer)
            }
            
            y += yInc
        }
        
    }
    
    let html: String =
"""
<html>
<head>
<style type=\"text/css\">
body{
 font-size: 100px;
 font-family:verdana;
 text-align: center;
 color: #ffdd00;
}
</style>
</head>
<body>
<p>This is some web page body text in a WKWebView.</p>
<p>Red and Green shape layers are <i><b>behind</b></i> the html content.</p>
<p>Blue and Cyan shape layers are <i><b>on top of</b></i> the html content.</p>
<p>Let's add enough text to exceed the height of the web view so we can see what happens when we scroll.</p>
</body>
</html>
"""
    
}

看起来像这样:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在 Swift 中交错 WebView 和 CALayerViews 的相关文章

  • swift 中的延迟函数[重复]

    这个问题在这里已经有答案了 我没有可供采样的代码或任何东西 因为我不知道该怎么做 但是有人可以告诉我如何使用 swift 将函数延迟一定的时间吗 您可以使用 GCD 在示例中延迟 10 秒 Swift 2 let triggerTime I
  • VSTS 上的云托管 Mac 上的 Xcode 中生成错误

    我在云上构建项目时遇到以下错误 没有这样的模块 RxCocoa 导入RxCocoa 构建失败 以下构建命令失败 编译Swift正常arm64CompileSwiftSources正常arm64com apple xcode tools sw
  • 使用 Swift 生成随机数

    我需要生成一个随机数 看来arc4random功能不再存在以及arc4random uniform功能 我有的选择是arc4random stir arc4random buf UnsafeMutablePointer
  • uiwebview 中的高分辨率图像

    我有一个显示图像的网络视图 如下面的代码所示 该捆绑包还有一个 电子邮件受保护 cdn cgi l email protection尺寸为 128x128 适用于 iPhone4 这 电子邮件受保护 cdn cgi l email prot
  • 迭代弱引用数组,其中对象符合 Swift 中的协议

    我想将对象存储在数组中 其中对象很弱 并且符合协议 但是当我尝试循环它时 我收到编译器错误 public class Weak
  • CSS 3 多列中的 jQuery offset() 方法

    这里遇到了一些严重的问题 我正在开发一个 iOS 应用程序 它必须使用 CSS 多列模块在 UIWebView 中的多个列中显示 html 页面 我将以下 CSS 规则添加到页面中以完成多列 padding 0px height 850 0
  • 将 UIWebView 标题发送到 UINavigationBar

    我正在尝试将 UIWebView 页面标题发送到 UINavigationBar 如果用户单击链接 UINavigationBar 显示后退按钮 但如果在主页上隐藏后退按钮 我也希望如此 要将标题页检索到 UIWebView 中 您可以使用
  • Swift 中获取 UIPanGestureRecognizer 的起点和终点

    我在用着UIPanGestureRecognizer在一个项目上 我想取起点和终点 我试着做touchesBegin 但没有得到满足我需要的代码 如何获取起点和终点UIPanGestureRecognizer 对于您的情况 您可能希望将我的
  • Android 中的 addJavascriptInterface 相当于 iOS 中的功能

    你可能知道 Android 的 WebView 有一个名为addJavascriptInterface 它将 Android JAVA 对象导入到 Javascript 上下文中 问题是 iOS 上有类似的东西吗 iOS 上的 UIWebV
  • 未调用NotificationServiceExtension

    iOS 10发布后 我使用NotificationServiceExtension用于图像通知 效果很好 但最近我发现有些不对劲 UNNotificationServiceExtension 中的代码不再调用 我不确定原因 所以我创建了一个
  • 将应用程序发送到后台并从 XCTest 中的最近应用程序重新启动它

    我正在寻找问题的解决方案 其中我需要将我的应用程序发送到后台并在特定时间间隔后从最近的应用程序重新启动它 在 Instruments UIAutomation 中使用 deactivateAppForDuration 来实现此目的 有谁知道
  • 在不使用PrepareForSegue的情况下在segue之间传递数据

    我正在使用情节提要创建一个用户设置帐户 分 5 个步骤 每个步骤都有一个 ViewController 1 输入姓名 联系人等 2 导入照片 3 输入等 4 更多输入 5 确认页面 如果用户单击 确认 gt 获取所有输入并上传到解析 当我在
  • Swift上传文件到PHP服务器

    因此 我将文件从 swift 上传到 PHP 服务器 POST 请求按预期到达 带有标头和所有内容 但我无法从中获取任何内容 FILES 它只是一个空数组 我显然在 Swift 方面做错了什么 这是我的代码 func testUpload
  • 遵守协议并保持财产私有

    我需要将符合类中的协议属性用作私有属性 但编译器拒绝这样做 我怎样才能实现呢 protocol ProtocolX class var x Int get set func performAnyActionOnX extension Pro
  • 在单独的类中录制和播放语音 (Swift3)

    我使用了许多用于录制和播放声音的代码 但其中大多数不在 swift3 中 并且它们在我的应用程序中不起作用 This https github com genedelisa AVFoundationRecorder代码有效 但我想从视图控制
  • 计算 Swift 4 中的时差

    如果我有两个变量 10 30 和另一个 1 20 有没有办法获得它们之间的 2小时50分钟 的时间差 我在下面尝试过这个 func calcTime time1 String time2 String gt String let time1
  • 带过滤器的 AudioKit 导出文件

    我想用音频套件的许多过滤器覆盖现有的 m4a 文件 我的代码 file try AKAudioFile forReading recordVoiceURL player AKPlayer audioFile file delay AKVar
  • 是否可以使 MGLPolyLines 可选择? - 斯威夫特,MapBox

    是否可以使 MGLPolyLine 可触摸 可选择 具有用户交互 在我的项目中 用户需要触摸折线 有这个问题 https stackoverflow com questions 43683846 how to make a mglpolyl
  • 通过 NSDate 过滤 Realm 中的查询会抛出 NSInvalidArgumentException

    我到处寻找 甚至访问了一些带有永远不会消失的病毒警告消息的可疑网站 但我无法弄清楚这一点 我只是想过滤Results
  • Swift 3 - 如何从另一个视图插入 TableView 单元格?

    我正在使用 Swift 3 Xcode 8 2 我试图弄清楚如何从选项卡式视图控制器的另一个选项卡将单元格插入到表视图中 我的表视图 class MyTableView UITableViewController var items Ite

随机推荐