我知道我们在点上操作而不是像素,在大多数情况下它很方便,但我需要使UIView为1像素而不是2像素高度。因此,如果您在Interaface构建器中拖放一些UIView(分隔线),并使其高度为1px(点),那么它仍然看起来像视网膜屏幕上的2像素大小线(在设备和模拟器上)。
我知道视图上有contentScaleFactor属性,它显示的是视网膜(2.0f)与否(1.0f)。看起来这些视图的值为1.0f,因此您需要从主屏幕中检索它:
[UIScreen mainScreen].scale;
这让我回归2.0f。现在,我为这个分隔符视图添加了高度约束,添加了检查isRetina的方法,并将该行划分为1个像素:
- (void)awakeFromNib{
[super awakeFromNib];
CGFloat isRetina = ([UIScreen mainScreen].scale == 2.0f) ? YES : NO;
if (isRetina) {
self.separatorViewHeightConstraint.constant /= 2;
}
}
这样可行,我只是不确定使用0.5值...
答案 0 :(得分:13)
要支持较新的3倍显示器(例如iPhone 6+),请使用以下代码:
UIScreen* mainScreen = [UIScreen mainScreen];
CGFloat onePixel = 1.0 / mainScreen.scale;
if ([mainScreen respondsToSelector:@selector(nativeScale)])
onePixel = 1.0 / mainScreen.nativeScale;
答案 1 :(得分:10)
您的代码有效。使用0.5来设置UIView的帧将按照需要工作,因为帧的参数是CGFloat。如果您希望使用以点单位表示单个像素的CGFloat而不是self.separatorViewHeightConstraint.constant,则以下代码将起作用。
CGFloat scaleOfMainScreen = [UIScreen mainScreen].scale;
CGFloat alwaysOnePixelInPointUnits = 1.0/scaleOfMainScreen;
答案 2 :(得分:6)
你可以做到
self.separatorViewHeightConstraint.constant = self.separatorViewHeightConstraint.constant / [UIScreen mainScreen].scale;
是将值设置为0.5是在视网膜上获得“真实”1px线的唯一方法
答案 3 :(得分:2)
可悲的是,没有其他答案适用于iPhone 6 Plus。
在iPhone 6 Plus上无法使用1px行,因为屏幕在1242x2208中渲染,然后向下采样到1080x1920。有时你会得到一条近乎完美的1px线,有时线条会完全消失。
请参阅http://www.paintcodeapp.com/news/iphone-6-screens-demystified以获得正确的解释。