如何在不将其添加到子视图的情况下截取 uiview?

Posted

技术标签:

【中文标题】如何在不将其添加到子视图的情况下截取 uiview?【英文标题】:How do I screenshot a uiview without adding it to the subview? 【发布时间】:2017-04-07 08:40:10 【问题描述】:

我在父视图上有多个子视图,我需要将 uiview 转换为 uiimage 但只有某些子视图。因此,我在需要截取屏幕截图的视图中添加了一个标签,并将其添加到自己的视图中,但是当我尝试截取屏幕截图时,我得到了一个黑屏。但是,当我使用常规父视图时,我会得到一张包含所有子视图的照片。

let viewPic = UIView()

            for subview in self.view.subviews 

                if(subview.tag == 6) 
                    viewPic.addSubview(subview)
                

                if(subview.tag == 8) 
                    viewPic.addSubview(subview)
                
            

            let picImage = viewPic.getSnapshotImage() //This is a black screen

获取快照图像

extension UIView 
    public func getSnapshotImage() -> UIImage 
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.isOpaque, 0)
        self.drawHierarchy(in: self.bounds, afterScreenUpdates: false)
        let snapshotItem: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return snapshotItem
    

【问题讨论】:

参考这个答案,它可能会帮助你ios Screenshot part of the screen 【参考方案1】:

首先,您的viewPic 没有设置帧大小,因此默认为零帧,这可能会导致问题。

其次,我尝试在我的示例项目中使用您的getSanpshotImage(),但我总是得到空白图像。

看看演示代码,我可以得到你想要的(见截图):

class ViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let viewPic = UIView()
        viewPic.frame = self.view.frame

        let view1 = UIView()
        view1.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
        view1.backgroundColor = UIColor.red
        viewPic.addSubview(view1)

        let view2 = UIView()
        view2.frame = CGRect(x: 0, y: 200, width: 100, height: 100)
        view2.backgroundColor = UIColor.blue
        viewPic.addSubview(view2)

        let picImage = viewPic.convertToImage() //This is a black screen
        print(picImage)
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    




extension UIView 
    func convertToImage() -> UIImage 
        let renderer = UIGraphicsImageRenderer(bounds: bounds)
        return renderer.image  rendererContext in
            layer.render(in: rendererContext.cgContext)
        
    

【讨论】:

以上是关于如何在不将其添加到子视图的情况下截取 uiview?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不将其添加到目录的情况下在多个团队中安装机器人?

如何在不知道它是哪个视图的情况下将 UIView 添加为最顶层视图的子视图?

如何在不将实例模型添加到数据库的情况下向实体模型添加FK约束?

如何在不将其注册为机器人的情况下创建不和谐机器人?

如何在不将其备份到 iCloud 的情况下为我的应用程序提供演示数据?

如何在不将其连接到终端的情况下运行“屏幕”,以便可以在 C++ (qt) 应用程序中捕获输出?