0

我的应用程序中有一个二维表,我希望每个单元格周围有一个 1 像素厚的边框。每个单元格都是不同的UIView,我发现我可以用以下方式绘制这样的边界:

dataCell.layer.borderWidth = 0.5; // repeat for each cell
tableContainer.layer.borderWidth = 1.0; // do once for the entire table

这对视网膜和非视网膜设备都有好处。但是现在我想在显示之前先将我的表格渲染成图像,并且在非视网膜设备上,结果如下所示:

模糊的细胞分裂

表格的边界很好,但各个单元格的边界变得模糊。我用于将整个事物转换为图像的方法是:

- (UIImage *)getImage {
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, [[UIScreen mainScreen]scale]);
    [[self layer] renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return viewImage;
}

那是上的一个类别UIView。我想将其显示为图像的原因是,当设备旋转时,当整个表格是单个静态对象时,生成的动画看起来要好得多,否则所有子视图都会彼此分离并沿着不同的轨迹进行动画处理进入他们的最终位置。

我能做些什么来解决这种模糊?

编辑:

虽然您确实无法真正显示小于 1 像素的线条,但实际上有两件事可以使这项工作发挥作用。首先,在视网膜屏幕上,0.5 个“逻辑”像素正好是 1 个真实像素,在这种情况下,iOS 渲染非常好。

在非视网膜设备上,iOS 做了一些不同的事情:当我要求在视图周围设置 0.5 像素的边框时,它会在视图的左侧和底部绘制 1 像素的边框。当我将许多这样的视图并排放置在一个网格中时,结果实际上是非常合理的——我在视图之间得到了 1px 的边框。

这是一个在白色单元格周围有 0.5px 边框的非视网膜再现的屏幕截图,右侧缺失(我通常只是在整个容器周围添加一个 1px 边框来解决这个问题)。这是没有把它变成图像的。

0.5px 边框

我认为这UIGraphicsGetCurrentContext()会进行所见即所得的渲染,并给我一个与屏幕上渲染的图像完全相同的图像。有什么办法可以欺骗它吗?

4

0 回答 0