Swift - snapshotView 功能不适用于大型 UIView

Posted

技术标签:

【中文标题】Swift - snapshotView 功能不适用于大型 UIView【英文标题】:Swift - snapshotView function is not working for large UIViews 【发布时间】:2020-07-02 08:01:17 【问题描述】:

我正在为 iPad(第 7 代)创建示例应用程序。 在那里我可以获得A2 大小的 UIView 的快照。但它不适用于A1 大小的 UiView。

A2 -> UIView(frame: CGRect(x: 0, y: 0, width: 2182, height: 3086))

A1 -> UIView(frame: CGRect(x: 0, y: 0, width: 3086, height: 4370))

我逐渐降低了 A1 的高度(即 4370 点),当高度低于 4096 点时它开始工作。

我查看了苹果文档,但找不到任何线索。谁能解释为什么? ????

import UIKit

class ViewController: UIViewController 
    let page = UIView(frame: CGRect(x: 0, y: 0, width: 2182, height: 3086)) // this is working (A2 page size)
    //let page = UIView(frame: CGRect(x: 0, y: 0, width: 3086, height: 4370)) // this is not working (A1 page size)
    
    let pagePreviewContainer = UIView()
    
    override func viewDidLoad() 
        super.viewDidLoad()
        page.backgroundColor = .yellow
        self.view.addSubview(page)
        
        let someSubView = UIView(frame: CGRect(x: 10, y: 10, width: 25, height: 25))
        someSubView.backgroundColor = .red
        page.addSubview(someSubView)
        
        pagePreviewContainer.translatesAutoresizingMaskIntoConstraints = false
        pagePreviewContainer.layer.borderColor = UIColor.blue.cgColor
        pagePreviewContainer.layer.borderWidth = 1
        
        view.addSubview(pagePreviewContainer)
        
        NSLayoutConstraint.activate([
            pagePreviewContainer.widthAnchor.constraint(equalToConstant: 400),
            pagePreviewContainer.heightAnchor.constraint(equalToConstant: 400),
            pagePreviewContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            pagePreviewContainer.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -100)
        ])
    
    
    override func viewDidLayoutSubviews() 
        super.viewDidLayoutSubviews()
        
        let previewOfPage = self.page.snapshotView(afterScreenUpdates: true)
        pagePreviewContainer.addSubview(previewOfPage!)
        self.view.layoutIfNeeded()
    

【问题讨论】:

【参考方案1】:

您达到 4096 的限制我并不感到惊讶,因为它是 2 的幂,并且图形系统中的纹理始终以 2 的幂的大小存储。由于iPad是@2x设备,所以图片的高度其实是8192。

我没有确切的答案,因为我从未尝试过,但我有几个建议。

您可以使用 CoreGraphics 并将视图的图层绘制到图像上下文中。除了更改您的快照调用之外,这基本上不需要任何更改。

如果这仍然不起作用,您可能需要考虑使用 CoreGraphics“手动”渲染视图上的内容。

您还可以以尽可能高的分辨率进行渲染,然后放大图像,如果差别不大,可能不会被注意到。

【讨论】:

@EmilionPelaez 据此,似乎核心图形也无法正常工作***.com/questions/42904135/…【参考方案2】:

由于 iPad 是@2x 设备,而第 7 代 iPad 的高度分辨率为 2048px,它们根本无法捕获大于 2x2048 = 4096 的视图,因此它是一个页面预览,因此请尝试调整输出图像的大小并制作它适合预览容器。

【讨论】:

输出图像是什么意思?我没有使用任何核心图形来生成快照图像。实际上使用核心图形没问题,但缺乏 snapshotView(afterScreenUpdates:) 的性能,所以对我的目的没有用:)

以上是关于Swift - snapshotView 功能不适用于大型 UIView的主要内容,如果未能解决你的问题,请参考以下文章

snapshotView AfterScreenUpdates 创建一个空白图像

`convertFromSnakeCase` 策略不适用于 Swift 中的自定义 `CodingKeys`

iOS 11 自动填充密码功能不适用于英语以外的其他语言

Mixpanel 不适用于 swift

谓词不适用于 CoreData - Swift 4

Swift 代码完成不适用于 Cocoapods