关闭

UIView的drawHierarchy vs CALayer的render

标签: ui
456人阅读 评论(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的描画函数。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

UIWindow、UIView以及CALayer之间的关系

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

UIView和CALayer的那些事儿

万剑归宗,UIView和CALayer都是的祖宗都是NSObjet。 继承结构UIView的继承结构为: UIResponder : NSObject。 UIResponder是用来响应事件的,也...
  • ab20514
  • ab20514
  • 2016-02-24 18:16
  • 468

20.CALayer动画与UIView动画的疑惑

CALayer动画与UIView动画的使用场合         我本来对于CALayer动画的一些使用场合比较疑惑,可以直接用UIView块动画为什么要费心思写CALayer动画呢?所以首先,我想说一...
  • changyuxiaoxiao
  • changyuxiaoxiao
  • 2016-03-29 21:46
  • 535

CALayer--设置UIView圆角,裁剪子视图,快速圆形UIView

一、简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮、一个文本标签、一个文本输入框、一个图标等等,这些都是UIView。 其实UIView之所以能显示在屏幕上,完全是...
  • u010165653
  • u010165653
  • 2014-12-10 16:10
  • 2123

UIView - 图层CALayer(裁边 & 改边角 & 加阴影)

一、简单介绍         在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮、一个文本标签、一个文本输入框、一个图标等等,这些都是UIView。 其实UIView之...
  • CatStarXcode
  • CatStarXcode
  • 2016-01-11 10:26
  • 1763

iOS --- 如何暂停和继续CALayer上的动画

本文主要介绍了如何暂停和继续CALayer的动画. 首先来看CALayer./** The base layer class. **/@interface CALayer : NSObject NSC...
  • icetime17
  • icetime17
  • 2016-08-16 23:28
  • 2678

iOS 复制UIView所有的对象

像这样,需要在这三个view里面都加载一个名字为“subView”的UIView,因为各种原因,比如“subView”里面的子view非常多,导致要重新写一个一模一样的特别麻烦,第一个反应是 直接让l...
  • a997013919
  • a997013919
  • 2017-07-02 12:32
  • 599

UIView及其分类的属性方法定义

UIView是iOS开发中最熟悉的控件,不是因为它用得多,而是很多UI控件都是继承它的,了解它的分类方法是很有必要的。 UIView其实是由多个分类构成,主要有如下几个分类: UIView :基本属性...
  • qq_14920635
  • qq_14920635
  • 2017-03-28 17:04
  • 506

UIView刷新问题

 http://blog.csdn.net/cssmhyl/article/details/7860774
  • xiaoyuanzhiying
  • xiaoyuanzhiying
  • 2014-10-30 19:59
  • 1534

UIView 上下文和layer之间的关系详解

iOS绘图教程(一)   (2014-01-16 12:50:10) 转载▼   分类: ios绘图教程 原文链接:http://www...
  • moxi_wang
  • moxi_wang
  • 2015-09-07 15:12
  • 1533
    个人资料
    • 访问:33364次
    • 积分:768
    • 等级:
    • 排名:千里之外
    • 原创:38篇
    • 转载:4篇
    • 译文:6篇
    • 评论:12条
    最新评论