Objective c 相对于屏幕属性定位子视图

Objective c 相对于屏幕属性定位子视图,objective-c,ios,uiview,Objective C,Ios,Uiview,我想将多个小UIView显示为相对于屏幕属性的子视图。这应该适用于不同的屏幕尺寸(iPad、iPhone)/纵向/横向模式 要显示的每个子视图都有两个NSNumber对象,其无符号整数范围为-100(最小值)到100(最大值),需要映射到正确的x和y坐标进行定位 转换这些值(-100…100)的最佳方法是什么,以便在屏幕上定位UIView 我如何以相对的方式而不是绝对的方式定位它们,以便代码在屏幕旋转和屏幕大小之间工作 如果使用+/-100范围,则可能需要使用底层Calayer来定位视图。CA

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

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

  • 转换这些值(-100…100)的最佳方法是什么,以便在屏幕上定位UIView
  • 我如何以相对的方式而不是绝对的方式定位它们,以便代码在屏幕旋转和屏幕大小之间工作

如果使用+/-100范围,则可能需要使用底层Calayer来定位视图。CALayers的优点在于,它们的定位点映射到笛卡尔平面上0.0到+1.0范围内的设备不可知网格。

好的,如果我理解正确,您希望x方向的-100映射到屏幕上的最左侧点,x方向的100映射到屏幕上的最右侧点,-y方向上的-100映射到屏幕上的最低点,y方向上的100映射到屏幕上的最高点(或者您可能希望y与我的y相反,以便它与屏幕坐标系一致,在屏幕坐标系中,y越大,屏幕上的y越低?)。 我们还要考虑旋转

据我所知,询问
UIScreen
高度和
宽度

CGFloat width = [UIScreen mainScreen].bounds.size.width;
CGFloat height = [UIScreen mainScreen].bounds.size.height;
但这不包括轮换。我所知道的另一种非常简单的方法是询问覆盖屏幕的
ui视图的
宽度和
高度(最简单的方法是,您可以使viewcontroller的视图覆盖整个屏幕)

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

CGFloat width = myView.frame.size.width;
CGFloat height = myView.frame.size.height;
这些应自行调整方向(根据我的经验,如果您在
视图中获得
高度
宽度
,则它肯定会起作用。如果没有,则必须实现
UIView
或之后的任何内容。此外,
UIView
需要是
UIViewController
的视图属性或此视图的子视图。如果没有,则必须实现
didroteratefrominterface。)方向:
或找到其他方法来告诉您的视图任何旋转)。一旦我们有了屏幕的“宽度”和“高度”,我们就可以从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,并转换为屏幕上各自的点