Ios 为什么小于1.0pts的线条不能在非视网膜屏幕上正确渲染?

Ios 为什么小于1.0pts的线条不能在非视网膜屏幕上正确渲染?,ios,retina-display,quartz-core,Ios,Retina Display,Quartz Core,在ui按钮或UITextField上,在视网膜屏幕上渲染精细,但在非视网膜屏幕上,仅渲染顶部和左侧边框,而不渲染右侧和底部边框 我认为这与屏幕的dpi以及如何绘制子点线有关,但可能有更好的解释 问题: 我想知道是否有可能在视网膜和非视网膜屏幕上按预期显示ui视图边框的所有侧面,并且borderWidth设置为0.5如果您总是想要一条单像素(非点)线,则必须根据屏幕的比例使用不同的边框宽度 例如: 既然支持多个音阶(@3x),那么最好将Matt的答案写为: CGFloat scale = [[UI

ui按钮
UITextField
上,在视网膜屏幕上渲染精细,但在非视网膜屏幕上,仅渲染顶部和左侧边框,而不渲染右侧和底部边框

我认为这与屏幕的dpi以及如何绘制子点线有关,但可能有更好的解释

问题:
我想知道是否有可能在视网膜和非视网膜屏幕上按预期显示
ui视图
边框的所有侧面,并且
borderWidth
设置为
0.5

如果您总是想要一条单像素(非点)线,则必须根据屏幕的比例使用不同的边框宽度

例如:


既然支持多个音阶(@3x),那么最好将Matt的答案写为:

CGFloat scale = [[UIScreen mainScreen] scale];
if (scale == 2.0)  { 
    // retina screen;
    self.layer.borderWidth = 0.5;
} else {
    // non-retina screen
    self.layer.borderWidth = 1.0;
}

这可能是一个可以接受的答案,但您是否知道是什么原因导致我问题中的代码导致右边框和下边框不显示或可能被剪裁?
CGFloat height=1/[[UIScreen mainScreen]scale]
让高度=1/UIScreen.mainScreen()。比例
对于视网膜上的Swift 2.2,0.5分的一半是1像素。1像素边界是一个完全一致且明确的概念。另一方面,在非视网膜上,0.5点是半个像素。如果要求框架绘制半像素边框,您希望得到什么样的结果?我想如果您使用64位编译,您需要删除“f”后缀?据我所知,CGFloat是64的双精度bit@kalehv是的,修复了不使用后缀的示例。
CGFloat scale = [[UIScreen mainScreen] scale];
if (scale == 2.0)  { 
    // retina screen;
    self.layer.borderWidth = 0.5;
} else {
    // non-retina screen
    self.layer.borderWidth = 1.0;
}
CGFloat scale = [[UIScreen mainScreen] scale];
CGFloat width = scale > 0.0 ? 1.0 / scale : 1.0;
[self.layer setBorderWidth:width];