我的应用程序中有一个二维表,我希望每个单元格周围有一个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.5px边框时,它会在视图的左下方绘制1px边框。当我在网格中并排放置许多这样的视图时,结果实际上非常明智 - 我在视图之间获得了1px的边框。
以下是白色细胞周围0.5px边框的非视网膜再现的屏幕截图,其右侧缺失(我通常只是在整个容器周围添加1px边框来修复)。这没有把它变成图像。
我认为UIGraphicsGetCurrentContext()
会做一种WYSIWYG渲染,并给我一个与屏幕上呈现的图像完全相同的图像。有没有办法欺骗它呢?