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

在iOS SuperView中强制布局位置和大小,ios,ipad,uiview,landscape,superview,Ios,Ipad,Uiview,Landscape,Superview,我有个大问题,我真的希望你能帮我。。。我现在很迷茫: 我有一个运行MainWindow.xib的项目。在我的应用程序代理文件中,我检查设备的方向,并加载相应的NIB文件,该文件根据方向具有不同的布局子视图。以下是检查方向的代码: -(void)checkTheOrientation { if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft ||

我有个大问题,我真的希望你能帮我。。。我现在很迷茫:

我有一个运行MainWindow.xib的项目。在我的应用程序代理文件中,我检查设备的方向,并加载相应的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和y位置未分别设置为0和0一样

以下是纵向视图: 以下是带有错误的横向视图:

在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];
    }
}
这个方法的问题是,这只是一个非常糟糕的黑客行为,实际上并不能解决我的问题。在横向加载时,它现在将子视图的大小和位置调整为1024x768,0,0,但我通过其他NIB加载的任何其他子视图都有相同的问题

我真正想知道的是,我到底如何才能将横向主superview设置为1024x768位置0和0,而不必尝试将其合并并继续执行performLayout选择器?目前,有很多与此不一致的地方,因为黑客实际上没有正确设置superview的大小,而只是在superview顶部加载子视图

我认为这样一个简单的修复可能会解决superview的问题,但可惜它没有: window.frame=CGRectMake0,0,1024,768


我只希望我的主superview在加载时的位置和大小正确,然后superview只加载到正确的位置。你能帮我吗

首先,UIView有一个名为-layoutSubviews的方法,您可以重写该方法以按自己的喜好定位子视图。首次加载视图时将调用它,如果您向它发送-setNeedsLayout消息,则在绘制之前再次调用它


其次,您应该能够在.xib或故事板文件中正确设置这些位置。在.xib文件中选择主视图,并检查其在尺寸检查器中的位置。此外,请确保在属性检查器中将视图设置为横向。如果一切都是正确的,那么还有别的事情发生。为了简化问题,在Xcode中创建一个新项目,在横向方向上只有一个空视图。我刚做了一个,位置没有问题。这正是您在真实应用程序中想要的,因此,请找出真实应用程序中发生了什么,从而影响视图的位置,而这在您的新示例应用程序中没有发生。

一点与答案无关的评论:这不是正确的方法,更好的方法是从xib文件中设置正确的行为。我使用了同样的方法,在大型应用程序中遇到了可怕的问题。@MarcoPace我以前从未遇到过XIB文件的问题,但无论我在IB中做什么,都不会真正改变我的布局。我只是担心无法从纵向模式更改的MainWindow.xib可能是问题的根本原因。你有什么建议我可以试试吗?Caleb,谢谢你的评论。我现在已经用NSLog验证了layoutSubviews的执行是否正确,但左侧仍然有奇怪的黑色空间。这是我的代码:这是我很抱歉的代码,但是当我点击回车键时,堆栈溢出一直在发布我的评论。。。