方法
UIViewController.view
のサブビューとして画面表示されているUIViewは、当然ながら表示中のUIViewControllerが切り替わると、表示されなくなります。
pushViewController:
やpresentViewController:
しても常に特定のUIViewを表示し続けたい場合、UIWindowのサブビューとして追加することで対応できます。
SnippetAddSubViewToWindow.m
// UIWindowを取得して
UIWindow *window = ...;
// 表示し続けたいビューを追加
[window addSubview:someView];
補足1. UIWindowへのアクセス
UIWindowは、UIApplicationDelegateのサブクラスにプロパティとして保持しておくと、アクセスしやすいです。
SnippetAppDelegateToReferWindow.m
// たとえばこんなデリゲートを定義しておき
@interface YMApplicationDelegate: UIResponder <UIApplicationDelegate>
@property(nonatomic, strong) UIWindow *window;
@end
// 別クラスから、目的のビューを追加する時点で参照を得る
YMApplicationDelegate *appDelegate = [UIApplication sharedApplication].delegate;
UIWindow *window = appDelegate.window;
筆者はStoryBoardを使わずにUIWIndowを直接allocしていますが、
前者の場合もプロパティをIBOutletにしておき、XIBファイルからリンクすれば多分できる...と思います。
またUIApplicationやUIScreenから別の方法で取得することもできるかもしれません(未調査)。
補足2. 常時表示したビューへのアクセス
常時表示したビューは、画面によって表示/非表示させるなど、表示中のUIViewControllerからアクセスすることが多いです。シングルトンパターンで目的のビューを取得できるようにしておくと便利です。
SnippetViewToAccessAnywhereWithSingleton.m
// こんな感じでシングルトンアクセスできるようにしておいて
@interface YMModalView : UIView
+ (instancetype)sharedView;
@end
@implementation YMModalView
static YMModalview * __sharedView;
+ (instancetype)sharedView{
if(!__sharedView) __sharedView = [[YMModalView alloc] init];
return __sharedView;
}
@end
// コントローラから参照する
- (void)viewDidLoad{
[super viewDidLoad];
YMModalView *modalView = [YMModalView sharedView];
// ...
}