0

画面の向きを変えるときに、画面を瞬時に回転させたいのですが。私のViewControllerには、1つのUIImageと1つのUILabelがあります。私は次のようにします:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
[self willRotateToInterfaceOrientation:[self interfaceOrientation] duration:0];
}

ラインアプリがなくてもクラッシュしません:

[self willRotateToInterfaceOrientation:[self interfaceOrientation] duration:0];

期間をゼロに設定しようとするコード行では、ローテーションが終了した直後にアプリがクラッシュします。

私が間違っていることについて何か考えはありますか?

ありがとうございました。

4

2 に答える 2

1

無限ループを作成しています。

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
  [self willRotateToInterfaceOrientation:[self interfaceOrientation] duration:0];
  }

同じ関数をそれ自体の中から呼び出しています。何を目指していますか?

于 2011-02-02T14:38:20.960 に答える
1

多くのwillRotateToInterfaceOrientation:duration:呼び出しを次々にスタックしています。実際、メソッドが最初に呼び出されると、クラッシュするまで何度も何度も呼び出されます。duration:0を指定しても意味がありません。実際、ローテーションエフェクトに使用されるCoreAnimationのタイミングは、Run Loopスレッドとは別のスレッドで実行されるため、この方法で呼び出しのスタックを停止することはできません。回転後にアプリがクラッシュする理由は、スタックがいっぱいになっている間にアニメーションがすでに開始されている(別のスレッド)という事実が原因である可能性があります。

自動回転を無効にしてUIDeviceOrientationDidChangeNotification通知を監視し、適切なビュー変換を適用するだけで、即座に方向を取得できます。

于 2011-02-02T14:39:59.990 に答える