在iPhone / iPad的屏幕空间中,Apple使用的点数通常是屏幕实际分辨率的一半。我的问题是,是否可以自己访问实际像素?例如,如果我使用UIView,并使其大小/位置为0,0,0.5,0.5,背景颜色为红色,我无法在屏幕上看到它。
只是想知道这是否可能。
谢谢!
答案 0 :(得分:1)
您已拥有的代码应该正常工作(UIView
,其大小为(0.5, 0.5)
。我刚刚运行它并从模拟器中捕获了这个结果:
是的。这很难看。让我们放大。
所以是的,您可以在屏幕上绘制比单点更小的值。
但是,要绘制单个像素,您需要使用1/scaleOfScreen
的点值(因为并非所有设备都显示2x
)。因此,例如,您希望您的代码看起来像这样:
CGFloat scale = [UIScreen mainScreen].scale;
CGFloat pixelPointWidth = 1/scale;
UIView* v = [[UIView alloc] initWithFrame:CGRectMake(20, 20, pixelPointWidth, pixelPointWidth)];
v.backgroundColor = [UIColor redColor];
[self.view addSubview:v];
现在,这将创建一个占据屏幕上单个像素的UIView
。
虽然,如果你想做很多像素完美的绘图,你应该使用比单UIView
(have a look at Core Graphics)更低级别的东西。
在iPhone 6 Plus上绘图时,您可能会遇到此方法的一些问题。由于它的屏幕scale
与其nativeScale
不同,因此它会首先在3x
的逻辑坐标空间中呈现您的内容,然后下采样到实际的屏幕分辨率(约为2.6x
)。
这很可能会导致一些像素出血,你的像素在哪里?视图可以在相邻像素中渲染(尽管通常亮度降低)。
不幸的是,没有使用更低级别的API(如OpenGL或Metal)就没有简单的方法解决这个问题,你可以绕过这种自动缩放然后下采样,直接绘制到屏幕的实际坐标空间
Have a look here,了解不同设备如何在屏幕上呈现内容。
Have a look here了解有关iPhone 6 Plus如何发生像素出血的更多信息。
答案 1 :(得分:0)
您可以根据设备分辨率(以ppi为单位)通过乘以系数来猜测像素,但您不想这样做。
此外,在您的例子中,您没有声明您对坐标进行了标准化,因此基本上您试图在第一个像素(左上角)显示一个红色框,大小为半个点,这就是为什么你不能看到它。
修改强>
要绘制一个红色框,您可以使用以下示例代码:
// Draw a red box
[[UIColor redColor] set];
UIRectFill(CGRectMake(20, 20, 100, 100)); // position (x : 20, y: 20) (still top left) and size (100*100 points)