5

カスタム コンテナー ビュー コントローラーの作成に慣れるために、テスト アプリを作成しました。アプリを最初に起動したとき、または別のビュー コントローラーに切り替えた後にデバイスを回転させると、意図したとおり、新しいビューのサイズが変更されて画面全体が占有されます。ただし、アプリの起動後に回転し、新しいビュー コントローラーに切り替えると、ビューは短く広くなるのではなく、縦長のサイズを維持します (実際には少し異なります。320,460 から 300,480 になります)。マスター ビュー コントローラーは、アプリ デリゲート (xib なし) で割り当てられ、ウィンドウのルート ビュー コントローラーとして設定されます。MasterViewController (カスタム コンテナー コントローラー) にあるコードは次のとおりです。

- (void)viewDidLoad {
    [super viewDidLoad];
    WelcomeController *welcome = [[WelcomeController alloc] initWithNibName:@"ViewController" bundle:nil];
    self.currentController = welcome;
    [self addChildViewController:welcome];
    [self.view addSubview:welcome.view];

    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeft:)];
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    [self.view addGestureRecognizer:swipeLeft];
}


- (void)swipeLeft:(UISwipeGestureRecognizer *)gesture {
    if (gesture.state == UIGestureRecognizerStateRecognized) {
        UIActionSheet *sheet =[[UIActionSheet alloc] initWithTitle:@"Select A Destination" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"welcome",@"Play",@"Scores", nil];
        [sheet showInView:self.view];
    }
}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    switch (buttonIndex) {
        case 0:{
            if ([self.currentController class] != [WelcomeController class] ) {
                WelcomeController *welcome = [[WelcomeController alloc] initWithNibName:@"ViewController" bundle:nil];
                [self addChildViewController:welcome];
                [self moveToNewController:welcome];
            }
            break;
        }
        case 1:{
            if ([self.currentController class] != [PlayViewController class] ) {
                PlayViewController *player = [[PlayViewController alloc] initWithNibName:@"PlayViewController" bundle:nil];
                [self addChildViewController:player];
                [self moveToNewController:player];
            }
            break;
        }
        case 2:{
            if ([self.currentController class] != [HighScores class] ) {
                HighScores *scorer = [[HighScores alloc] initWithNibName:@"HighScores" bundle:nil];
                [self addChildViewController:scorer];
                [self moveToNewController:scorer];
            }
            break;
        }
        case 3:
            NSLog(@"Cancelled");
            break;

        default:
            break;
    }
}

-(void)moveToNewController:(id) newController {
    [self.currentController willMoveToParentViewController:nil];
    [self transitionFromViewController:self.currentController toViewController:newController duration:.6 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{}
     completion:^(BOOL finished) {
         [self.currentController removeFromParentViewController];
         [newController didMoveToParentViewController:self];
         self.currentController = newController;
     }];
}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;//(interfaceOrientation == (UIInterfaceOrientationPortrait | UIInterfaceOrientationLandscapeLeft));
}

なぜこれが起こっているのか考えてみてください(これがマスターView Controllerのビューのサイズが変更されていないことを意味するかどうかはわかりませんが、このサイズ変更以外の動作を取得すると、ジェスチャー認識エンジンは画面全体ではなく狭いビューでのみ応答します)?

4

2 に答える 2

1

子ViewControllerにローテーションメッセージを送信していません。少なくともあなたが投稿したコードにはありません。子コントローラーを切り替えた後、[self.currentController removeFromParentViewController]を使用してChildViewControllers配列から前の子を削除することもできるため、-(BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllersを実装しても、ParentViewControllerには常に1つのChildViewControllerしかありません。

私はこれを機能させたので、私はこれをどのように行っているかを貼り付けます。まず、すべてのViewControllerを作成し、それらを子ビューコントローラーとしてParentViewControllerに追加します。次に、didMoveToParentViewController:メソッドを呼び出します。

//Controller1
Controller1 *c1 = [[Controller1 alloc] init];
c1.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[self addChildViewController:c1];
[c1 didMoveToParentViewController:self];

//Controller2
Controller2 *c2 = [storyboard instantiateViewControllerWithIdentifier:@"c2"]; 
index.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[self addChildViewController:c2];
[c2 didMoveToParentViewController:self];
c2.view.frame = m_contentView.frame;
[self.view addSubview:c2.view];   //It is in initial screen so set it right away
m_selectedViewController = c2;

//Controller3
Controller3 *c3 = [storyboard instantiateViewControllerWithIdentifier:@"c3"];
compare.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[self addChildViewController:c3];
[c3 didMoveToParentViewController:self];

m_controllers = [NSArray arrayWithObjects:c1, c2, c3, nil];  //Hmm now i think this is not needed, I can access viewController directly from self.childViewControllers array

それから私は実装しました

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
{
    return YES;
}

子ビューコントローラへの切り替えは、このコードで行われます

if (value < m_controllers.count)
{
    UIViewController *contentViewController = [m_controllers objectAtIndex:value];
    
    contentViewController.view.frame = m_contentView.frame;
    
    [self transitionFromViewController:m_selectedViewController toViewController:contentViewController duration:0 options:UIViewAnimationOptionTransitionNone animations:nil completion:^(BOOL finished) {
        m_selectedViewController = contentViewController;
        }
     ];
}

これで十分です。しかし、私はこれに関していくつかの問題を抱えているので、私は自分で非アクティブなチャイルズにローテーションメッセージを送信します。

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    for (UIViewController *vc in m_controllers) 
    {
        if(vc != m_selectedViewController)
            [vc willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    }
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    for (UIViewController *vc in m_controllers) 
    {
        if(vc != m_selectedViewController)
            [vc willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
    }
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    for (UIViewController *vc in m_controllers) 
    {
        if(vc != m_selectedViewController)
            [vc didRotateFromInterfaceOrientation:fromInterfaceOrientation];
    }
}
于 2013-01-24T18:27:59.963 に答える
0

手動で追加

self.view.autoresizesSubviews = YES;

中身

- (void)viewDidLoad

そしてそれは問題を解決しました、

何らかの理由でストーリーボード内の値が使用されていなかったと思います

于 2013-09-15T16:39:16.653 に答える