LoginSignup
17
19

More than 5 years have passed since last update.

UIViewを、コントローラが画面遷移しても常に表示し続ける方法

Posted at

方法

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];
    // ...
}
17
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
19