我想将多个小的 UIViews 显示为相对于屏幕资产的子视图。这应该适用于不同的屏幕尺寸(iPad、iPhone)/纵向/横向模式。
每个要显示的子视图都有两个 NSNumber 对象,其无符号整数范围从-100(最小值)到100(最大值),需要映射到正确的x和y坐标以进行定位。
- 转换这些值(-100...100)以使用它们在屏幕上定位 UIView的最佳方法是什么?
- 我如何以相对而不是绝对的方式定位它们,以便代码可以跨屏幕旋转和屏幕尺寸工作?
我想将多个小的 UIViews 显示为相对于屏幕资产的子视图。这应该适用于不同的屏幕尺寸(iPad、iPhone)/纵向/横向模式。
每个要显示的子视图都有两个 NSNumber 对象,其无符号整数范围从-100(最小值)到100(最大值),需要映射到正确的x和y坐标以进行定位。
好的,所以如果我理解正确,您希望 x 方向的 -100 映射到屏幕上最左边的点,x 方向的 100 映射到屏幕上最右边的点,y 方向的 -100 映射到屏幕上的最低点,并且 y 中的 100 映射到屏幕上的最高点(或者您可能希望 y 与我所拥有的相反,以便它与屏幕坐标系一致,其中 y 越大越低你得到的屏幕?)。我们还想考虑轮换。
据我了解,要求UIScreen
它的height
and width
:
CGFloat width = [UIScreen mainScreen].bounds.size.width;
CGFloat height = [UIScreen mainScreen].bounds.size.height;
但这并没有考虑到轮换。我知道的唯一另一种非常简单的方法是要求UIView
覆盖屏幕它的width
和height
(最简单的,你可以让你的视图控制器的视图覆盖整个屏幕)。
如果您有一个UIView
完美覆盖整个屏幕(我们称之为 myView),您可以尝试:
CGFloat width = myView.frame.size.width;
CGFloat height = myView.frame.size.height;
height
这些应该自己调整方向(根据我的经验,如果你得到and width
in或之后的任何东西,它肯定会起作用viewDidAppear:animated:
。还UIView
需要是UIViewController
s 视图属性或该视图的子视图。如果没有,你将拥有实施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 转换为屏幕上各自的点。
如果您使用 +/-100 的范围,那么您可能希望使用底层的 CALayers 来定位您的视图。CALayers 的优点在于,它们的锚点映射到与设备无关的网格,该网格在笛卡尔平面上的范围从 0.0 到 +1.0。