1

私は大きな問題を抱えています、そしてあなたがここで私を助けてくれることを本当に望んでいます...私は今非常に迷っています:(

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に設定されていないかのように、左側に太い黒のエッジで読み込まれます。

これが縦向きのビューです: 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];
    }
}

この方法の問題は、これが非常に悪いハックであり、実際には私の問題を解決していないことです。ランドスケープにロードすると、サブビューのサイズが変更されて1024x768,0,0に配置されますが、他のNIBを介してロードする追加のサブビューにも同じ問題があります。

私が本当に知りたいのは、これを一緒にハックしてperformLayoutセレクターを実行し続けることなく、ランドスケープのメインスーパービューを1024x768の位置0と0に設定する方法です。現時点では、ハックによってスーパービューのサイズが正しく設定されておらず、スーパービューの上にロードするサブビューだけが設定されているため、これには多くの矛盾があります。

このような簡単な修正でスーパービューの問題が解決するかもしれないと思いましたが、残念ながら解決しません。window.frame = CGRectMake(0、0、1024、768);

メインのスーパービューをロード時に正しく配置およびサイズ設定してから、スーパービューを適切な場所にロードするだけです。ここで私を助けてくれませんか?

4

1 に答える 1

0

まず、UIViewには-layoutSubviews、サブビューを好きなように配置するためにオーバーライドできるという名前のメソッドがあります。ビューが最初にロードされたときに呼び出され、メッセージを送信した場合は描画する前に呼び出され-setNeedsLayoutます。

次に、.xibまたはストーリーボードファイルでこれらの位置を適切に設定できる必要があります。.xibファイルでメインビューを選択し、サイズインスペクターでその位置を確認します。また、属性インスペクタでビューが横向きに設定されていることを確認してください。それがすべて正しければ、何か他のことが起こっています。問題を単純化するために、横向きの空のビューのみを使用してXcodeで新しいプロジェクトを作成します。私は1つだけ実行しましたが、位置の問題はありません。これが実際のアプリで必要なことなので、実際のアプリで何が起こっているかを把握して、新しいサンプルアプリでは発生していないビューの位置に影響を与えます。

于 2012-05-03T13:10:05.647 に答える