当您将手机的方向设置为横向模式时,幕后的真实情况是什么?当我追踪主屏幕的边界和任何子视图的边界时,宽度和高度仍然是320x480,而不是480x320。

知道为什么吗?

有帮助吗?

解决方案 6

发现问题 - 旋转后边界仍然相同的原因是旋转后唯一受影响的是视图的变换属性。

快速查看视图的变换给了我:

2012-01-31 12:19:02.114 TestScollviewRotation[9834:207] orientation: UIDeviceOrientationPortrait
2012-01-31 12:19:02.116 TestScollviewRotation[9834:207] 0.000000 -1.000000 1.000000 0.000000

2012-01-31 12:21:41.898 TestScollviewRotation[9834:207] orientation: UIDeviceOrientationPortraitUpsideDown
2012-01-31 12:21:41.898 TestScollviewRotation[9834:207] 0.000000 1.000000 -1.000000 0.000000

2012-01-31 12:21:58.780 TestScollviewRotation[9834:207] orientation: UIDeviceOrientationLandscapeRight
2012-01-31 12:21:58.780 TestScollviewRotation[9834:207] 1.000000 0.000000 -0.000000 1.000000

2012-01-31 12:19:03.181 TestScollviewRotation[9834:207] orientation: UIDeviceOrientationLandscapeLeft
2012-01-31 12:19:03.181 TestScollviewRotation[9834:207] 1.000000 0.000000 -0.000000 1.000000

其他提示

您是在检查bounds属性还是frame属性?某些控件,尤其是填满屏幕的UIViews,看起来在任何方向都保持相同的框架;我认为AppKit设置了他们的转换属性来旋转它们的内容。

您可能会发现bounds属性具有您在大多数时间期望的值,但是frame属性没有。

这是一个很大的话题,但我会加上0.02;评论仅限于肖像和风景之间的变化;也就是说,不是颠倒,面朝上,面朝下,不知道的事情。

  1. 如果视图没有侦听方向更改,则无论方向如何,框架和边界都将保持不变。

  2. 如果视图已注册以侦听方向更改,则边界可能更改;即,在横向整个屏幕框架中<!> lt; 320,480 <!> gt;边界是<!> lt; 480,320 <!> gt;。这假定:

    一个。你要么使用带有适当的YES返回值的shouldAutorotateToInterfaceOrientation回调,要么

    湾明确注册通知中心以收听UIDeviceOrientationDidChangeNotification。

  3. 方法2a仅适用于属于应用程序窗口的根视图控制器的视图;也就是说,首先添加了视图的视图控制器。方法2b可以与仿射变换和手动边界变化结合使用,以获得不受自动旋转控制的视图的正确方向布局。

我发现如果您没有使用UINavigationController,您可能会遇到视图问题而没有给出正确的视图和帧边界。

我直接向UIWindow添加了视图,并且确实遇到了这个问题。但当我在UIWindow和我的UIViews之间夹入UINavigationController时,问题就消失了。

希望有所帮助

是的,框架和边界保持不变,你应该检查ViewController的interfaceOrientation属性,并相应地处理宽度和高度,如果你的布局特别依赖于这些。

我目前在iPad应用程序上遇到了同样的问题。

我<!>“解决了<!>”;它通过查询视图interfaceOrientation,如果它是UIDeviceOrientationPortraitUIDeviceOrientationPortraitUpsideDown,那么我在视图中手动设置子图层的框架(这是CAGradientLayer)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top