将 UIView 坐标从纵向转换为横向,反之亦然

Posted

技术标签:

【中文标题】将 UIView 坐标从纵向转换为横向,反之亦然【英文标题】:Convert UIView co-ordinates from portrait to landscape and vice-versa 【发布时间】:2013-05-28 15:05:42 【问题描述】:

我的 iPad 应用程序允许用户创建 UIView 并将它们放置在主视图上。所以这些视图是通过编程而不是在 xib 文件中创建的。然后它会记住这些 UIView 的坐标。然后,用户可以选择稍后显示此 UIView 集合。

----------------   ----------------
|Collection 1 >| > |          |   |  
|Collection 2  |   | View A   |   |
|Collection 3  |   |          |   |
|              |   |--------------|
|              |   |     |        |
|              |   |     | View B |
|              |   |     |        |
----------------   ----------------

所以,上面你可以看到Collection 1已经被选中了。

现在,该应用应该可以横向和纵向使用。因此,如果以纵向创建视图,然后以横向显示,我该如何处理坐标?反之亦然?甚至在创建视图时。

在我的情况下,我希望 UIViews 按比例调整,如果视图在一个方向上相互邻接,那么它们也应该在另一个方向上邻接。所以上面变成了这样:

----------------   ------------------
|Collection 1 >| > |          |     |  
|Collection 2  |   | View A   |     |
|Collection 3  |   |----------------|  
|              |   |     | View B   |
|              |   |     |          |
|              |   ------------------  
|              |    
---------------- 

我想我要问的部分内容是:有没有一种方法可以在不实际旋转的情况下获得另一个方向的坐标?

【问题讨论】:

您打算使用自动布局吗?视图布局的方法将根据您是否存在而有所不同。 我很高兴使用自动布局,但根据我的经验,它可能很难解开 在这种情况下,自动调整蒙版大小将是您的答案。我想有人已经把你送过去了:) 我认为你是对的,但是当视图是在横向创建时,我该如何重新创建纵向视图? 自动调整大小将在改变方向时调整视图的大小。如果您稍后需要重现相同的大小,那么在调整大小后立即(可能是一个名为 didFinishAutorotating 之类的钩子)检查子视图的 frame 属性的值并将它们存储在变量中以供以后使用。 【参考方案1】:

您应该为子视图(视图 A 和视图 B)“打开”所有调整大小的蒙版。

viewA.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin |
                         UIViewAutoresizingFlexibleWidth |
                         UIViewAutoresizingFlexibleRightMargin |
                         UIViewAutoresizingFlexibleTopMargin |
                         UIViewAutoresizingFlexibleHeight |
                         UIViewAutoresizingFlexibleBottomMargin;

如果您这样做,那么视图的所有边缘将保持它们的位置作为父视图空间的一部分。例如,视图 A 的框架可以被认为是 (left, top, width, height) = (0%, 0%, 80%, 50%) 而视图 B 的框架是 (40%, 50%, 60%, 50%) .当您旋转视图时,视图的底部和顶部仍为 50%,尽管这在数值上是不同的值。视图 A 的左侧和顶部仍然紧靠父视图的边缘。即使这些边距是灵活的,但如果边距为零,它们也不会改变。 B 的右边缘和下边缘相同。

【讨论】:

【参考方案2】:

您只需要设置自动调整大小的蒙版。像 view.autoresizingMask = UIViewAutoresizingMaskFlexibleWidth | UIViewAutoresizingMaskFlexibleHeight

编辑:我刚刚意识到,我忘记了视图 b 的情况。

主视图需要设置:UIViewAutoresizingMaskFlexibleWidth | UIViewAutoresizingMaskFlexibleHeight

对于视图 A:UIViewAutoresizingMaskFlexibleWidth | UIViewAutoresizingMaskFlexibleHeight

由于视图 A 的高度会降低,视图 B 必须向上移动。我们需要设置灵活的上边距掩码。

对于视图 B:UIViewAutoresizingMaskFlexibleWidth | UIViewAutoresizingMaskFlexibleHeight | UIViewAutoresizingFlexibleTopMargin

在提供自动调整大小的掩码时,我假设您将视图放置在相对的顶部。这意味着您已经设置了框架,或者只是一个像 10.0 这样的值,或者是相对于放置在它自己的视图上方的元素,比如 viewB.frame = CGRectMake(xCoordinate, viewA.frame.origin.y + viewA.frame.size.height, width, height)

如果你让他们像viewB.frame = CGRectMake(xCoordinate, mainView.frame.size.height - 200.0, width, height)这样的底层亲戚,它就行不通了

【讨论】:

您是指主视图还是子视图?无法让它工作 在你的情况下所有这些。由于窗口大小已更改,您的主视图将调整大小。并且子视图将被调整大小,因为主视图的大小已经改变。或者,您可以为子视图的子视图设置不同的 autoresizingMasks 请注意您设置的框架是纵向的。当您进入横向模式时,autoresizingMask 会更改帧。因此,在编程和设置框架时,只需考虑纵向方向和 autoresizingMask 会为您按比例更改它们,并取决于您如何设置它们。您可以在这里developer.apple.com/library/ios/#documentation/UIKit/Reference/… 找到可能性,当然您也可以将它们结合起来。【参考方案3】:

您可以将处理坐标的逻辑移出单独的方法,并根据ios版本在usingShouldAutorotateToInterfaceOrientationshouldAutorotate中调用此方法

【讨论】:

以上是关于将 UIView 坐标从纵向转换为横向,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章

旋转放置和移动视图 (UIView)

屏幕坐标和当前窗口坐标如何转换???

当我在 iOS7 的 iPad 中将视图从纵向旋转到横向或反之亦然时,UITextfield shouldChangeCharactersInRange 没有调用

将我的项目从纵向转换为横向的问题

如何在 iPad 中检查设备方向从纵向到横向和反之亦然的变化 [重复]

在两个视图之间切换以及从纵向切换到横向时出现 iPad 方向问题,反之亦然