0

以下に非常によく似たコードを使用しています:

- (void)flipToViewController:(UIViewController*)targetViewController
              transition:(UIViewAnimationTransition)transition

{if(targetViewController){[[[self activeViewController] view] setUserInteractionEnabled:NO];

  // force the view to be instantiated (loadView/layoutSubviews)
  [[targetViewController view] setHidden:NO];

  [UIView beginAnimations:nil context:NULL];
  [UIView setAnimationDuration:0.8f];
  [UIView setAnimationTransition:transition forView:self.view cache:YES];

  [targetViewController viewWillAppear:YES];
  [[self activeViewController] viewWillDisappear:YES];

  [[[self activeViewController] view] removeFromSuperview];

  [[self view] addSubview:[targetViewController view]];

  [[self activeViewController] viewDidDisappear:YES];
  [targetViewController viewDidAppear:YES];

  [[targetViewController view] setUserInteractionEnabled:YES];

  [UIView commitAnimations];

  [self setActiveViewController:targetViewController];
  }

}

フリップトランジションを使用していますが、targetViewControllerがビューにフリップすると、ビューが正しく初期化されません。UISegmentedControlが奇妙に見え、1つのサブビューが間違った位置にあります。

アニメーションが終了して初めて、すべてが正しい場所に落ち着きます。

私はすべてのサブビュー設定をviewWillAppear(viewDidAppearではない)で行っているので、なぜそれが時間内に初期化されないのか理解できません。

助言がありますか?

また、(デバッグ後)viewWillAppearがviewDidLoadメソッドの前に呼び出されることに気付きましたか?なぜこれを行うのでしょうか?

4

1 に答える 1

0

次の行を移動します。

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.8f];
[UIView setAnimationTransition:transition forView:self.view cache:YES];

.. この行のすぐ下:

[[self view] addSubview:[targetViewController view]];

どうやら addSubView/insertSubView はアニメーション内にあってはなりません。

于 2011-05-22T21:41:59.130 に答える