1

已经有几个问题,但没有一个令人满意的答案。我想确切地知道为什么框架和边界似乎是错误的,使用最简单的例子,并且有人告诉我处理它的正确方法是什么......

我制作了一个没有情节提要的单视图应用程序,并且我只勾选了对横向的支持。然后在 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 来安排或调整子视图的大小。

避免此类问题的最新和“正确”方法是什么?(不使用笔尖或情节提要,也没有粗俗的宽度和高度交换)

4

2 回答 2

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;
}

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

编辑:

看看这个 SO question及其答案。他们提供了一些不错的解决方法。此外,鉴于在应用程序中,您的视图控制器大多嵌入导航控制器或选项卡栏控制器或两者兼而有之,您可以继续在它们上进行子类化/创建类别,以确保所有内容都转发到您的视图控制器。

另一个很好的答案解释了实际发生的事情。

于 2013-10-04T10:48:32.530 回答
0

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

相反,在旋转后检查它们:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    NSLog(@"Bounds %@", NSStringFromCGRect(self.view.bounds));
    NSLog(@"Frame %@", NSStringFromCGRect(self.view.frame));
}
于 2013-10-04T10:48:58.817 回答