UIView的drawHierarchy vs CALayer的render

标签: ui
684人阅读 评论(0) 收藏 举报
分类:

项目中有这样的需求:将多个视图进行拼接成为一张图片,进而进行分享。大体思路是将多个视图放在一个父视图中,再将父视图转换成图片。视图转图片的代码:

func convertViewToImage(_ useViewDrawing: Bool = false) -> UIImage? {
        var rect = self.frame
        if self.isKind(of: UIScrollView.self) {
            rect.size = (self as! UIScrollView).contentSize
        }
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0)
        guard let context = UIGraphicsGetCurrentContext() else {return nil}
        context.saveGState()
        context.translateBy(x: self.center.x, y: self.center.y)
        context.concatenate(self.transform)
        context.translateBy(x: -self.bounds.size.width * self.layer.anchorPoint.x, y: -self.bounds.size.height * self.layer.anchorPoint.y)
        if useViewDrawing && self.responds(to: #selector(UIView.drawHierarchy(in:afterScreenUpdates:))) {
            // afterScreenUpdates true:包含最近的屏幕更新内容 false:不包含刚加入视图层次但未显示的内容
            self.drawHierarchy(in: self.bounds, afterScreenUpdates: true)
        } else {
            self.layer.render(in: context)
        }
        context.restoreGState()
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }

几个版本运行没问题,前几天有用户反馈说他分享出来的内容是空的。分析了一下是他的数据过多,拼接成的视图Size(375, 7000),最终self.drawHierarchy处理后得到了空数据,没有得到期望的结果。
经过测试发现:
1,self.drawHierarchy虽然比layer渲染速度快,但是处理超长视图时无法得到其图片,这是需要用Layer的渲染函数来处理。
2,对于地图视图,如果用Layer渲染的方法,得到是黑色图片,必须用UIView的描画函数。

查看评论

CALayer简介 (十)CALyer与截屏

获取CALayer中的内容——截屏 UIGraphicsBeginImageContext(self.view.bounds.size); [self.view.layer renderI...
  • czcdms
  • czcdms
  • 2015-03-27 17:03:48
  • 927

03 - renderInContext:与drawInContext:方法 - 截屏(截图)无法显示子控件

03 - renderInContext:与drawInContext:方法 - 截屏(截图)无法显示子控件问题描述 前提 : 自定义View:包含若干个子控件 理想现象 : 用上下文(UIGraph...
  • Gilgamesho
  • Gilgamesho
  • 2016-03-23 12:27:01
  • 3055

UIView的drawHierarchy vs CALayer的render

项目中有这样的需求:将多个视图进行拼接成为一张图片,进而进行分享。大体思路是将多个视图放在一个父视图中,再将父视图转换成图片。视图转图片的代码:func convertViewToImage(_ us...
  • dangyalingengjia
  • dangyalingengjia
  • 2017-08-22 11:04:26
  • 684

iOS开发笔记之六十五——两种截屏方案的对比

******阅读完此文,大概需要3分钟****** 业务开发中常常需要截屏生成一张UIView的Image,我们前期就做了一个需要对UIView进行截屏的需求,iOS上截屏的方案有多种,因为我们需要控...
  • lizitao
  • lizitao
  • 2017-07-09 11:26:31
  • 530

UIWindow、UIView以及CALayer之间的关系

UIWindow、UIView以及CALayer之间的关系
  • aaaa99996666
  • aaaa99996666
  • 2016-05-11 20:46:35
  • 709

iOS --- UIView与CALayer的联系与区别

UIView是iOS系统中界面元素的基础, 所有的界面元素都继承自它, UIView本身完全是由CoreAnimation来实现. 真正的绘图部分, 是由一个CALayer类来管理. UIView更像...
  • icetime17
  • icetime17
  • 2015-09-07 07:21:51
  • 2170

Android UI 优化——使用HierarchyViewer工具

我们这一篇文章会提到为什么使用HierarchyViewer,怎么使用HierarchyViewer,后者内容会多一下。...
  • xyz_lmn
  • xyz_lmn
  • 2013-12-25 23:09:59
  • 75490

Android 性能优化 一 布局优化工具Hierarchy Viewer的使用

网上已经有很多关于Hierarchy Viewer如何使用的文章,这里就不一步步的演示具体怎样使用了,ddna兄的《【Android工具】被忽略的UI检视利器:Hierarchy Viewer》与张兴...
  • love_world_
  • love_world_
  • 2014-07-07 08:13:16
  • 5984

IOS面试题总结--UIView和CALayer的层级关系和区别

1.由于UIView继承自UIResponse,所以它是可以相应时间的,而CALayer是继承自NSObject,没有可以相应时间的接口。 2.UIView侧重于展示内容,而CALayer则侧重于图...
  • zhanglei1239
  • zhanglei1239
  • 2016-03-02 22:33:12
  • 1585

CALayer核心动画与UIView动画

iOS开发UI篇—核心动画(UIView封装动画) iOS开发UI篇—核心动画(UIView封装动画) 一、UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类...
  • zhanglizhi111
  • zhanglizhi111
  • 2016-05-06 17:48:59
  • 332
    个人资料
    持之以恒
    等级:
    访问量: 4万+
    积分: 956
    排名: 5万+
    最新评论