在iOS Superviews中强制布局位置和大小

时间:2012-05-03 12:42:08

标签: ios ipad uiview landscape superview

我遇到了一个大问题,我真的希望你能在这里帮助我......我此刻非常迷失:(

我有一个使用MainWindow.xib运行的项目。在我的app委托文件中,我检查设备的方向,并根据方向加载具有不同布局(子视图)的相应NIB文件。以下是检查方向的代码:

-(void)checkTheOrientation
{
    if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight) 
    {
        viewController = [[[MyViewController alloc] initWithNibName:@"MyWideViewController" bundle:nil] autorelease];
        NSLog(@"Landscape = MyWideViewController");
    } 
    else if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown)
    {   
        viewController = [[[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil] autorelease];
        NSLog(@"Portrait = MyViewController"); 
    }
}

这可以按预期工作,在横向或纵向中我正在加载正确的视图。纵向视图可以完美地加载,但是“横向”视图在左侧加载了一个厚黑色边缘,就像它的x& x一样。 y位置未设置为0&分别为0。

以下是纵向视图:http://uploads.socialcode.biz/2f25352B0e3x3z2t2z21 以下是包含错误的横向视图:http://uploads.socialcode.biz/1G2k3T012d1z0Y1U2q1k

在MyViewController.m文件中,我有一个粗略的修复方法,可以正确完成大小调整,以避免左侧出现这么大的黑条。这是以下代码:

- (void) performLayout {
    // Ensure the main view is properly placed
    NSInteger MaxSizeHeight, MaxSizeWidth;

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    {
        MaxSizeHeight = 1024;
        MaxSizeWidth  = 768;
    }
    if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight) {
        CGRect mainViewFrame = [[self view] frame];
        float width = mainViewFrame.size.width;
        mainViewFrame.size.width = mainViewFrame.size.height;
        mainViewFrame.size.height = width;
        mainViewFrame.origin.x = 0;
        mainViewFrame.origin.y = 0;
        [[self view] setFrame:mainViewFrame];
    } else {
        CGRect mainViewFrame = [[self view] frame];
        mainViewFrame.origin.x = MaxSizeWidth - mainViewFrame.size.width;
        mainViewFrame.origin.y = MaxSizeHeight - mainViewFrame.size.height;
        [[self view] setFrame:mainViewFrame];
    }

    // Ensure the content view is properly placed
    CGRect contentFrame = [mainContentView frame];
    if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight) 
    {
        contentFrame.size.width = MaxSizeHeight;
        contentFrame.size.height = MaxSizeWidth;
    }
    contentFrame.origin.x = 0;
    contentFrame.origin.y = 44;
    [mainContentView setFrame:contentFrame];

    // Ensure the content subviews are properly placed
    contentFrame.origin.y = 0;
    for (UIView *contentView in [mainContentView subviews]) {
        [contentView setFrame:contentFrame];
    }
}

这种方法的问题在于,这只是一个非常糟糕的黑客攻击,而且它实际上并没有解决我的问题。当它在Landscape中加载时,它现在调整大小并将子视图定位到1024x768,0,0但是我通过其他NIB加载的任何其他子视图都有同样的问题。

我真正想知道的是,我怎样才能将景观主视图设置为1024x768位置0& 0,而不必尝试和黑客一起并继续执行performLayout选择器?目前存在很多与此不一致的情况,因为黑客实际上没有正确设置超视图大小,而只是我在超级视图上加载的子视图。

我认为这样一个简单的解决方案可能会解决超级视图问题但是它并没有:     window.frame = CGRectMake(0,0,1024,768);

我只是希望我的主要超级视图在加载时正确放置并调整大小,然后超级视图才会加载到正确的位置。请你帮帮我吗???

1 个答案:

答案 0 :(得分:0)

首先,UIView有一个名为-layoutSubviews的方法,您可以覆盖该方法来定位您喜欢的子视图。它将在首次加载视图时调用,如果您发送-setNeedsLayout消息,则会在绘制之前再次调用。

其次,您应该能够在.xib或storyboard文件中正确设置这些位置。在.xib文件中选择主视图,并在“大小”检查器中检查其位置。此外,请确保在“属性”检查器中将视图设置为“横向”。如果一切正确,那么还有其他事情要发生。要简化问题,请在Xcode中创建一个新项目,除了横向方向的空视图外。我只做了一个,没有位置问题。这就是你想要的真实应用程序,所以要弄清楚你的真实应用程序中发生了什么,以影响你的新示例应用程序中没有发生的视图位置。