访问iPhone绝对像素位置

时间:2016-02-19 08:53:17

标签: ios

在iPhone / iPad的屏幕空间中,Apple使用的点数通常是屏幕实际分辨率的一半。我的问题是,是否可以自己访问实际像素?例如,如果我使用UIView,并使其大小/位置为0,0,0.5,0.5,背景颜色为红色,我无法在屏幕上看到它。

只是想知道这是否可能。

谢谢!

2 个答案:

答案 0 :(得分:1)

当然可以。

您已拥有的代码应该正常工作(UIView,其大小为(0.5, 0.5)。我刚刚运行它并从模拟器中捕获了这个结果:

enter image description here

是的。这很难看。让我们放大。

enter image description here

所以是的,您可以在屏幕上绘制比单点更小的值。

但是,要绘制单个像素,您需要使用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)就没有简单的方法解决这个问题,你可以绕过这种自动缩放然后下采样,直接绘制到屏幕的实际坐标空间

答案 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)