0

我想将多个小的 UIViews 显示为相对于屏幕资产的子视图。这应该适用于不同的屏幕尺寸(iPad、iPhone)/纵向/横向模式。

每个要显示的子视图都有两个 NSNumber 对象,其无符号整数范围从-100(最小值)到100(最大值),需要映射到正确的xy坐标以进行定位。

  • 转换这些值(-100...100)以使用它们在屏幕上定位 UIView的最佳方法是什么?
  • 我如何以相对而不是绝对的方式定位它们,以便代码可以跨屏幕旋转和屏幕尺寸工作?
4

2 回答 2

1

好的,所以如果我理解正确,您希望 x 方向的 -100 映射到屏幕上最左边的点,x 方向的 100 映射到屏幕上最右边的点,y 方向的 -100 映射到屏幕上的最低点,并且 y 中的 100 映射到屏幕上的最高点(或者您可能希望 y 与我所拥有的相反,以便它与屏幕坐标系一致,其中 y 越大越低你得到的屏幕?)。我们还想考虑轮换。

据我了解,要求UIScreen它的heightand width

CGFloat width = [UIScreen mainScreen].bounds.size.width;
CGFloat height = [UIScreen mainScreen].bounds.size.height;

但这并没有考虑到轮换。我知道的唯一另一种非常简单的方法是要求UIView覆盖屏幕它的widthheight(最简单的,你可以让你的视图控制器的视图覆盖整个屏幕)。

如果您有一个UIView完美覆盖整个屏幕(我们称之为 myView),您可以尝试:

CGFloat width = myView.frame.size.width;
CGFloat height = myView.frame.size.height;

height这些应该自己调整方向(根据我的经验,如果你得到and widthin或之​​后的任何东西,它肯定会起作用viewDidAppear:animated:。还UIView需要是UIViewControllers 视图属性或该视图的子视图。如果没有,你将拥有实施didRotateFromInterfaceOrientation:或找到其他方式来告诉您对任何旋转的看法)。一旦我们有了屏幕的“宽度”和“高度”,我们就可以将您的 int 转换为屏幕位置。尝试类似:

(CGPoint)convertX:(NSNumber *)x andY:(NSNumber *)y intoPoint
{
    pointX = ([x intValue] + 100.0)*width/200.0;
    pointY = (-[y intValue] + 100.0)*height/200.0; // remove the - sign at the front of the expression for y to grow as you move down the screen
    return CGPointMake(pointX, pointY);
}

将 x 和 y 中的 -100 到 100 转换为屏幕上各自的点。

于 2012-07-23T01:15:33.577 回答
0

如果您使用 +/-100 的范围,那么您可能希望使用底层的 CALayers 来定位您的视图。CALayers 的优点在于,它们的锚点映射到与设备无关的网格,该网格在笛卡尔平面上的范围从 0.0 到 +1.0。

于 2012-07-22T22:31:27.290 回答