2

Apple の NIB は回転をネイティブにサポートしていないため、同じビューに 2 つの異なる NIB (向きごとに 1 つずつ) を使用しようとしています。

私は次のことを試してみましたが、動作しますが、いくつかのサブビュー (Apple の OpenGL / GLKit ビューなど) が壊れます。

最初のローテーションのみが中断されます。その後のすべてのローテーションは期待どおりに機能します。したがって、Apple の「viewWill/Did」呼び出しのスタックには、ここで見逃している微妙な点があると思います。問題は、それに関する実際のドキュメントを見つけることができなかったことです.Appleドキュメント内のあちらこちらで、発生した呼び出しの「一部」と、いつ/なぜ.

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    if( UIInterfaceOrientationIsLandscape( toInterfaceOrientation) )
    {
        [[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@-landscape", NSStringFromClass([self class])] owner:self options:nil];

        [self viewDidAppear:FALSE];
        [self viewWillDisappear:FALSE];
        [self viewDidReload];
        [self viewWillAppear:FALSE];
        [self viewDidAppear:FALSE];

        [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navbar-landscape"] forBarMetrics:UIBarMetricsDefault];
    }
    else
    {
        [[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@", NSStringFromClass([self class])] owner:self options:nil];

        [self viewDidAppear:FALSE];
        [self viewWillDisappear:FALSE];
        [self viewDidReload];
        [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navbar-portrait"] forBarMetrics:UIBarMetricsDefault];
        [self viewWillAppear:FALSE];
        [self viewDidAppear:FALSE];
    }

}
4

3 に答える 3

2

Apple によると、あなたの場合、別の nib をロードするだけでなく、View Controller を変更する必要があります。

デバイスが縦向きか横向きかによって同じデータを異なる方法で表示したい場合、その方法は 2 つの別個のビュー コントローラーを使用することです。

正確な方法については、View Controller Programming Guideを参照してください。

お役に立てれば!

于 2012-12-16T17:08:37.383 に答える
0

問題が見つかりました。これは、特に Apple の OpenGL コードのバグのようです。影響を受けるのは、GLKit を使用するプロジェクトのみです。

Apple の GLKViewController は、Container VC (UINavigationController/UITabController/window の rootViewcontroller など) の全領域を占める唯一のビュー コントローラーである必要があり、1 つの GLKView を正確に管理する必要があります。画面、オートローテーションを壊します。(GLKVCがショーを実行しているものとして接続されているときにAppleが行っているいくつかのトリックがあるようです。それ以外の場合は起動しません)

理論的には、カスタムの Container View Controller (iOS 5 の新機能で、現在 Apple によって部分的にしか文書化されていません) を作成すると、正しく動作します。しかし、Apple がそのための完全なドキュメントを公開するまで (おそらく来年の WWDC でしょうか?)、それを行うのは非常に困難です。

于 2012-12-29T18:17:59.603 に答える
0

スタック オーバーフローで「[ios] さまざまなニブを回転させる」を検索すると、大量のヒットが得られます。そこには「創造的な」解決策がいくつかあります。

Levi の言い分を言えば、少なくとも iOS 4.3 までさかのぼると、Apple の助言は「向き固有の NIB を備えた新しいコントローラーをロードする」ことでした。Xcode では、古い iOS ドキュメント セットをインストールできます。また、iOS 4.3 View Controller Programming Guide を見ると、「代替ランドスケープ インターフェイスの作成」セクションに移動すると、当時の彼らの助言が現在見られるものと非常に似ていることがわかります (ただし、ストーリーボードではなく NIB を使用しています)。しかし、コンセプトは同じです。向きが異なる場合は、新しいView Controllerを起動します。私がこれをずっと前に調査したとき、バックグラウンドでNIBをロードすることを含むすべてのテクニックは、彼らにとってやや不器用に感じられるように見えたので、これは最も堅牢なアプローチになるでしょう。ランドスケープ コントローラーに対してこのモーダルを実行することで、重要なシステム通知やその他の操作が見過ごされることがなくなります。

個人的には、私は通常、さまざまな方向に個別の NIB をあきらめ、単一の NIB/シーンにとどまり、スプリングとストラット (別名自動サイズ変更マスク) に依存してレイアウト変更の大部分を行うのに十分な面倒を感じています。 . また、ビューの変更によって、コントロールの相互の再配置や背景画像の変更などを大幅に変更する必要がある場合は、プログラムでレイアウトを変更しますviewWillLayoutSubviews(iOS のバージョンが 5.0 未満の場合は、willAnimateRotationToInterfaceOrientation... ただし、iOS 5 以降の場合viewWillLayoutSubviewsは優れています)。

于 2012-12-16T20:58:13.003 に答える