我正在尝试以编程方式创建一个自定义视图控制器,其中包含以屏幕为中心的子视图。我成功了,当我导航到这个视图时,居中的视图出现在中心,并在您旋转设备时正确旋转。
但是,在这个导航应用程序中,如果我在不处于纵向模式时进入自定义视图,那么应该居中的视图会将自身定位在一个不是屏幕中心的位置。我已经将所有必要的自动调整大小属性放在视图、控制器、父级、祖母、圣母……我已经用完了可以粘贴自动调整大小掩码的东西,但这个例子仍然看起来很糟糕。
我确定我错过了一些可以解决所有问题的神奇方法的调用,但我还没有想出要调用什么或在哪里调用(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,这相差太大了。
当以横向模式进入视图并遵循自动旋转时,我缺少什么使这些子视图正确居中?