iPhoneX上使用drawHierarchy绘制不在屏幕上的view有边框的问题

项目中要分享一个图片,图片内容要根据用户数据来生成,而且生成的图片是不不会显示在屏幕上的。
这个需求不难,用UIView的drawHierarchy方法即可

        let rect = shareImageView.bounds
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0)
        shareImageView.drawHierarchy(in: rect, afterScreenUpdates: true)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

问题是,在iPhoneX上,绘制出来的图片左边和下边会有一定宽度的白边,在没有刘海的iPhone上一切正常。
排查了一下发现跟iOS版本没什么关系,只要有刘海,就会出现这个问题。
所以问题应该出在iPhoneX特有的东西上,
想来想去,iPhoneX在界面上特有的东西就只是刘海了,也就是safeArea的问题。
把正常的图片和有边框的图片对比一下,左边多了132px == 44 * 3,下边多了102px == 34 * 3
看这个数值的话,基本确定是safeArea的问题无疑了。
然后修改了View里面的约束,将相对与safeArea的约束,改为相对于superView,问题就解决了。

总结来说:
如果UIView的xib中使用了autoLayout和safeArea,那约束默认是相对于safeArea的。
绘制的View的时候,因为afterScreenUpdates传的是true,所以绘制出的图片是带有safeArea的。
即使这个View没有显示在屏幕上,也受这个规则影响(也正是因为没有出现在屏幕上,才不好发现显示有问题)。
解决方案就是修改autoLayout,当它是在屏幕上显示的来考虑即可。

你可能感兴趣的:(iPhoneX上使用drawHierarchy绘制不在屏幕上的view有边框的问题)