5

我正在尝试以编程方式创建一个自定义视图控制器,其中包含以屏幕为中心的子视图。我成功了,当我导航到这个视图时,居中的视图出现在中心,并在您旋转设备时正确旋转。

但是,在这个导航应用程序中,如果我在处于纵向模式时进入自定义视图,那么应该居中的视图会将自身定位在一个不是屏幕中心的位置。我已经将所有必要的自动调整大小属性放在视图、控制器、父级、祖母、圣母……我已经用完了可以粘贴自动调整大小掩码的东西,但这个例子仍然看起来很糟糕。

我确定我错过了一些可以解决所有问题的神奇方法的调用,但我还没有想出要调用什么或在哪里调用(setNeedsDisplay?setNeedsLayout?)。为了展示这个问题,我在https://github.com/gradha/iPhone-centered-rotation-test创建了一个完整的示例,您可以在模拟器或设备中克隆和运行它。我从 Apple 的导航控制器创建了这个,只需添加一个假单元格来推送我手动创建的视图。

自定义视图可以在https://github.com/gradha/iPhone-centered-rotation-test/blob/master/Classes/CenteredViewController.m找到,这里是负责创建居中子视图的 loadView 方法:

/* Try to force the parent view to be as we want it. */
self.view.backgroundColor = [UIColor yellowColor];
self.view.autoresizesSubviews = YES;
self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight |
    UIViewAutoresizingFlexibleWidth;

/* Top left blue square, for reference. */
blue_ = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 130, 130)];
[self.view addSubview:blue_];
blue_.backgroundColor = [UIColor blueColor];
[blue_ release];

/* Create red centered rectangle. */
red_ = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
red_.backgroundColor = [UIColor redColor];
red_.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin |
    UIViewAutoresizingFlexibleTopMargin |
    UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleRightMargin;
red_.center = self.view.center;
[self.view addSubview:red_];
[red_ release];

这是应用程序屏幕截图演练的链接,首先进入纵向模式并旋转屏幕(工作正常),然后进入横向模式并旋转(取决于旋转侧,它看起来很糟糕)。当您以横向模式进入视图时,根据方向,红色方块的左上角将是 196x34 或 140x34,这相差太大了。

当以横向模式进入视图并遵循自动旋转时,我缺少什么使这些子视图正确居中?

4

1 回答 1

8

似乎在横向方向之一中loadView,控制器的视图原点设置为 (0, 20),这会混淆视图添加到屏幕后发生的旋转和自动调整大小。奇怪的是,它在所有其他方向上都是 (0, 0)。

要解决此问题,请在后面添加此行[super loadView]

self.view.frame = self.view.bounds;

详细说明:由于帧原点不在 (0, 0) 处,因此self.view.center在使用它的上下文中的概念是不正确的。该center属性是该视图的中心,在其父视图中可见。你真正想要的是视图的中心bounds

通过将视图框架重置为视图的边界,您可以有效地将原点更改回 (0, 0),并且center可以正确使用。

于 2011-03-25T10:58:00.897 回答