0

(メモリ制限の理由で)再利用しているビューコントローラーがあります。したがって、新しいUIViewControllerをプッシュするのではなく、いくつかのパラメーターを設定してから、このVCにビューを再ロードさせます。コードは次のようなものです(通知コールバックによってトリガーされます):

- (void) reloadView: (NSNotification*) note
{
    // Save parameters for reloaded view
    UIWindow *window = (UIWindow*) self.view.superview;
    //CGAffineTransform xfrm = self.view.transform;  // Doesn't do what I want.

    // Trash this one & reload the view
    [self.view removeFromSuperview];
    self.view = nil;

    // force view reload
    if (self.view == nil)
    {
        NSLog(@"%s ***** Why didn't self.view reload?!", __PRETTY_FUNCTION__);
    }
    else
    {
        // restore params
        //self.view.transform = xfrm;  // Boo-hoo!
        [window addSubview: self.view];
    }
}

アプリが横向きのみであり、新しくリロードされたビューが縦向きとしてウィンドウに追加されることを除いて、すべてが正常に機能します。

古いビューの変換を新しいビューに強制しようとしましたが、奇妙なことに、それは回転を与えましたが、間抜けな平行移動オフセットを与えました。

UIViewControllerに「今すぐ回転します」と伝える方法はありますか...?

編集:

私はこのかなりばかげたハックを追加しました:

    // restore params
    self.view.transform = xfrm;
    self.view.center = CGPointMake(window.bounds.size.width / 2., window.bounds.size.height / 2.);
    [window addSubview: self.view];

これは望ましい結果をもたらしますが、コードベースにそのようなものがあることに本当に不満があります。確かにこれを行うためのより良い方法がありますか?!?!

ありがとう!

編集:

JPHとの話し合いの結果、答えは「そのようにしないでください」であることが判明しました。行われた詳細と再設計の一部については、コメントを参照してください。

4

1 に答える 1

3

あなたの問題はこれを使用することです:

[window addSubview: self.view];

ドキュメントから:

次の方法で、ビューコントローラのUIViewプロパティをUIWindow(プライマリビューコントローラと同じレベル)に追加する場合:

[myWindow addSubview:anotherController.view];

この追加のViewControllerは回転イベントを受信せず、回転することもありません。UIWindowに追加された最初のViewControllerのみが回転します。

https://developer.apple.com/library/ios/#qa/qa2010/qa1688.html

ルートビューコントローラーとサブビューがルートビューコントローラーのビューに追加されたデザインの方がはるかに望ましいです。

もう1つのオプションは、ビューを強制終了して再度追加するのではなく、そのビューで更新する必要があるすべてのものを更新することです。ビューを削除してすぐに再追加する理由がわかりません。

于 2012-11-16T02:57:56.660 に答える