UIViewController / UIView方向框架/边界仅在横向应用程序中

时间:2013-10-04 10:32:30

标签: ios objective-c uikit

这方面已经有一些问题,但没有一个问题得到满意答案。我想知道为什么框架和边界看起来是错误的,使用最简单的例子,并且有人告诉我应对它的正确方法是......

我制作了一个没有故事板的单一视图应用程序,我只勾选了对景观的支持。然后在didFinishLaunching方法中:


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    ViewController *vc = [[ViewController alloc] init];
    self.window.rootViewController = vc;
    [self.window makeKeyAndVisible];

    return YES;
}

并在视图控制器中:


- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor redColor];
}

- (void)viewDidAppear:(BOOL)animated
{
    NSLog(@"%.1f,%.1f",self.view.frame.size.width,self.view.frame.size.height);
}

然后输出是768.0,1024.0 - 这显然是错误的,即使红色填充了横向尺寸屏幕。所以我不能依靠self.view.frame或self.view.bounds来安排或调整子视图的大小。

什么是最新和“正确”的方法来避免这样的问题? (不使用笔尖或故事板,也不使用宽松和高度的黑客交换)

2 个答案:

答案 0 :(得分:0)

不确定这是否正确,但这是我最好的猜测,此时我无法测试。如果我没有误会,默认方向是任何应用程序的肖像。因此,为了支持不同的方向,您的应用程序应该实现自动旋转方法(根据您正在构建的iOS版本,有点不同)。因此,即使您选择的应用程序仅支持横向模式,它也不会实际旋转。尝试实现指定的方法,让我知道它是怎么回事......

对于iOS 5及更早版本,您应该使用:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
{
return YES;
}

return NO;
}

对于iOS 6及更高版本,您应该使用:

-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscape;
}

-(BOOL)shouldAutorotate
{
return YES;
}

如果在旋转发生后检查视图的框架,它应该没问题。

编辑:

看一下this SO question及其答案。他们提供了一些很好的解决方法。此外,鉴于在应用程序中您将大多数视图控制器嵌入在导航控制器或标签栏控制器中,或者甚至两者都有,您可以继续并在其上创建类别以确保将所有内容转发到视图控制器。

另一个great answer解释了实际发生的事情。

答案 1 :(得分:0)

你过早检查框架和边界大小。

相反,请在轮换后检查它们:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    NSLog(@"Bounds %@", NSStringFromCGRect(self.view.bounds));
    NSLog(@"Frame %@", NSStringFromCGRect(self.view.frame));
}