web-dev-qa-db-ja.com

iOS:表示されたモーダルビューコントローラーの上にビューを配置する方法は?

AppDelegateクラスでタップバーに追加したアクティビティビューがあります。

[self.mainTabBar.view addSubview: spinner];

接続に問題がある場合は、各View Controllerに表示され、回転しています。特定のビューコントローラーにいくつかのボタンがあり、いくつかのモーダルビューコントローラーを表示します。そのモーダルビューコントローラーはスピナーと重なります。そのスピナーを常にすべてのビューの上に、または少なくともそのモーダルビューコントローラーの上に配置する方法は?私はモーダルビューコントローラーを提示するビューコントローラーでそのようなことを作ろうとしました:

[self presentModalViewController:selectionViewController animated:YES];
[self.view bringSubviewToFront:[self.tabBarController.view viewWithTag:15]];

動作しません。

23
nik

メインウィンドウにビューを追加します。

UIWindow* mainWindow = [[UIApplication sharedApplication] keyWindow];
[mainWindow addSubview: spinner];
63
Felix

Phix23の答えは正しいですが、これはより完全な例です:

//The view you want to present
UIViewController *viewControllerYouWantToPresentOnTop = [[UIViewController alloc] initWithNibName:nil bundle:nil];

//Create transparent Host view for presenting the above view
UIWindow* mainWindow = [[UIApplication sharedApplication] keyWindow];
UIViewController *viewControllerForPresentation = [[UIViewController alloc] init];
[[viewControllerForPresentation view] setBackgroundColor:[UIColor clearColor]];
[[viewControllerForPresentation view] setOpaque:FALSE];
[mainWindow addSubview:[viewControllerForPresentation view]];

//Make your transparent view controller present your actual view controller
[viewControllerForPresentation presentViewController:viewControllerYouWantToPresentOnTop animated:TRUE];

これらが不要になった場合は、自分でクリーンアップすることを忘れないでください。

このコードはアプリのどこからでも使用できます。

12
Maciej Swic

アプリは通常、その存続期間を通じて1つのウィンドウ内にコンテンツを表示します。しかし、他のすべての上にコンテンツを追加するために追加のウィンドウが使用される場合があります。 Appleは、別のウィンドウに追加することにより、UIAlertViewが常に一番上に留まるようにします。

UIView *contentView = [[UIView alloc] initWithFrame:contentFrame];
contentView.backgroundColor = [UIColor greenColor];
UIWindow *window = [[UIWindow alloc] initWithFrame:CGRectMake(x,y,contentFrame.size.width, contentFrame.size.height)];
window.windowLevel = UIWindowLevelAlert;
[window addSubview:contentView];
[window makeKeyAndVisible];

必要に応じてwindow.hidden = Yes or Noを設定して、ウィンドウを表示または非表示にします。これにより、アプリ内の他のすべての上にcontentViewが常に表示されます。

4

モーダルコントローラーは完全に異なるレイヤーにあり、提示するコントローラーのサブビューを重ねて表示することはできません。

内部にスピナーを備えたUIAlertViewを使用します。アラートは、モーダルコントローラーでさえ重なるレイヤーに表示されます。

0
Sulthan