将 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版本在usingShouldAutorotateToInterfaceOrientation
或shouldAutorotate
中调用此方法
【讨论】:
以上是关于将 UIView 坐标从纵向转换为横向,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章
当我在 iOS7 的 iPad 中将视图从纵向旋转到横向或反之亦然时,UITextfield shouldChangeCharactersInRange 没有调用