この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
1 はじめに
前回、前々回と、UIWindowを追加する件について、色々確認して来ましたが、だいたいイメージが湧いたということで、今回は、これを応用して半透明のメニューを作成してみました。
[iOS] 複数のUIWindowの挙動を確認する
[iOS] UIWindowを追加する
2 半透明のメニュー
最初に、完成の様子をご覧ください。
左から出現するメニューが、独自に追加したUIWindowです。下になっているNavigationViewの上に重なっているのがわかると思います。
1 半透明のUIWindow
起動時にプロパティで宣言したUIWindowに対して生成して、とりあえず画面外に配置しています。 UIWindowの背景色は、Alpha値を0.5に設定して、下の絵が透けて見えるようにしています。
@interface ViewController ()<MenuDelegate,UIGestureRecognizerDelegate>
@property (strong,nonatomic)UIWindow *menu; // プロパティとして定義
@end
・・・省略・・・
- (void)viewDidLoad {
[super viewDidLoad];
_menu = [UIWindow new];//MyWindowの生成
_menu.frame = CGRectMake(-180, 0, 180, [[UIScreen mainScreen] bounds].size.height); // 描画範囲(当初画面外に配置する
_menu.backgroundColor = [UIColor.blackColor colorWithAlphaComponent:0.5];//背景色をAlpha値0.5の黒色に設定
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Menu" bundle:nil];
MenuViewController *menuViewController = [storyboard instantiateViewControllerWithIdentifier:@"MenuViewController"];
menuViewController.delegate = self;
_menu.rootViewController = menuViewController;
[_menu makeKeyAndVisible];
・・・省略・・・
}
2 透明のビュー
UIWindowのルートには、ストーリーボドで作成したメニューを置きますが、こちらは、一番上のViewや、その下にあるTableViewもCellも、全て背景色を透明に設定しています。
3 ジェスチャーによるメニューの出現
viewDidLoadでSwipのジェスチャーを取得して
// swipdrag
UISwipeGestureRecognizer *leftSwip = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(didSwipe:)];
leftSwip.direction = UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:leftSwip];
UISwipeGestureRecognizer *rightSwip = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(didSwipe:)];
rightSwip.direction = UISwipeGestureRecognizerDirectionRight;
[self.view addGestureRecognizer:rightSwip];
ジェスチャーに応じて、メニューの開閉を行っています。
#pragma mark - Gesture Recognizer Delegate
- (void) didSwipe : (UISwipeGestureRecognizer *)sender {
if (sender.direction == UISwipeGestureRecognizerDirectionLeft){
[self closeMenu];
}else if(sender.direction == UISwipeGestureRecognizerDirectionRight){
[self openMenu];
}
}
#pragma mark - Action
- (void) openMenu
{
[UIView animateWithDuration:0.2f animations:^ {
_menu.frame = CGRectMake(0, 0, 180, [[UIScreen mainScreen] bounds].size.height);
}
];
}
- (void) closeMenu
{
[UIView animateWithDuration:0.2f animations:^ {
_menu.frame = CGRectMake(-180, 0, 180, [[UIScreen mainScreen] bounds].size.height);
}
];
}
4 最後に
しっかりと、動作を把握して使用すれば、UIWindowの追加もそれほど難しくないようです。 色々な表現も可能ですが、また、困った時の緊急避難にもなりそうな予感がしています。
5 参考資料
[iOS] 複数のUIWindowの挙動を確認する
[iOS] UIWindowを追加する
Objective-Cでアニメーションまとめ
[XCODE] iPhone上の画像を簡単にドラッグするUIGestureRecognizerの使い方
https://github.com/gotosleep/JASidePanels