2

UIViewController(たとえば、loginVC)があり、すべてのビューの上にそのビューを追加しようとしています。

このビューをに追加しようとしましたAppDelegate

[[AppDelegate sharedDelegate].window addSubview:loginVC.view];

しかし、この場合、自動回転は機能しないので、このビューをNavigationControllerのビューに追加しようとしました。NavigationControllerはrootViewControllerです:

[[AppDelegate sharedDelegate].navigationController.view addSubview:loginVC.view];

見た目は良く、自動回転しますが、回転すると奇妙な動作をします。

回転の開始後、ナビゲーションバーがloginVC.viewの上に表示され、回転の終了時に、スクリーンショットに表示されているように、このビューの後ろに移動します(より見やすくするために赤い背景を設定しました。背景は透明です。このビューの背後にあるすべてのものを参照してください):

ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください

私が試したこと:

  • 私はこれをstackoverflowのどこかで見つけました:回転する前にUIViewアニメーションを無効にし、回転した後にそれらを有効にします-回転はアニメーションなしで行われるため、見栄えがよくありません(少し明白です)

  • 回転前にnavigationBarを非表示にし、回転後に表示できるようにしようとしましたが、この場合、navigationBarはloginVC.viewの上に表示されます

次に行うこと-AppDelegateのウィンドウにこのビューを追加し、手動で回転を処理しますが、これを行うためのより良い方法があるかもしれません。

UPD:

スクリーンショット:

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

2番目のスクリーンショットで問題を確認できます:ナビゲーションバーが上にあります

4

2 に答える 2

0

uinavigationcontrollerにviewControllerを追加し、uinavigationcontrollerを押すと、常にナビゲーションバーが表示されます。

于 2013-01-24T10:54:02.093 に答える
0

私の友人はこの問題で私を助けてくれました

解決策は次のとおりです。

AppDelegateで、UIWindowプロパティを作成しました。

//AppDelegate.h
@property (nonatomic, strong) UIWindow *loginWindow;

アプリケーション起動時に初期化

//AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
....
    self.loginWindow = [[UIWindow alloc] init];
    self.loginWindow.windowLevel = UIWindowLevelStatusBar;
    self.loginWindow.frame = [[UIScreen mainScreen] bounds];
    self.loginWindow.backgroundColor = [UIColor clearColor];
....
    return YES;    
}

そして、loginVCで:

@interface loginVC ()
@property (nonatomic, weak) UIWindow *loginWindow;
@end

@implementation
....

- (void)show {
// setting up loginVC view 
    if (!self.loginWindow) {
          self.loginWindow = [[AppDelegate sharedDelegate] loginWindow];
    }
    if (![self.loginWindow.rootViewController isEqual:self]) {
          [self.loginWindow setRootViewController:self];
    }
    self.loginWindow.hidden = NO;
//UPD:
    //[self.loginWindow makeKeyAndVisible];
//UPD2:
    [self.loginWindow makeKeyWindow];
}

- (void)hide {
// hiding view and stuff
    [[[AppDelegate sharedDelegate] loginWindow] setHidden:YES];
//UPD:
    //[[[AppDelegate sharedDelegate] window] makeKeyAndVisible];
//UPD2:
    [[[AppDelegate sharedDelegate] window] makeKeyWindow];
}
@end

UPD:

makeKeyAndVisibleUIWindowのメソッドを使用する必要はありません。2番目のウィンドウは常に最初のウィンドウの上にあります。

UPD2:

もう一度私の答えを更新してください、多分それは誰かのために役立つでしょう。

smakeKeyAndVisibleを使用できなかっUITestFieldたため、そのコードのコメントを外し、別の問題に直面しました。

私は、このコントローラー内UIViewControllerに別のインスタンスを作成し、を呼び出します。提示された私は作成していますが、私が呼び出すときUIViewController[self presentViewController:...]UIViewControllerloginVC

[[[AppDelegate sharedDelegate] window] makeKeyAndVisible];

提示されたviewControllerは消えますが、最初のView ControllerにはまだこのコントローラーがありますpresentedViewController。そのため、他のViewControllerを提示することはできません。

私の解決策はで変更でしmakeKeyAndVisiblemakeKeyWindow

于 2013-01-24T15:53:28.887 に答える