アプリでよくあるUIで、ボタンをタップすると、画面外から横スライドして表示されるメニューを実装したいと思います。
今回はスライドしたメニューが画面に被さるように表示させてみます。
まず、スライドさせるビューをつくります。
今回はただのViewを使いますが、UITableViewの方がいいかと思います。
RightSlideMenuView.h
@interface RightSlideMenuView : UIView @end
RightSlideMenuView.m
@implementation RightSlideMenuView - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code self.frame = CGRectMake( [UIScreen mainScreen].bounds.size.width, 0, 160, 568); self.backgroundColor = [UIColor yellowCollor]; UILabel* title = [[UILabel alloc] initWithFrame:CGRectMake(30, 100, 100, 100)]; title.text = @"スライドメニューが表示されました"; title.backgroundColor = [UIColor clearColor]; } return self; }
次に、メニューを表示させたいViewControllerをつくります。
#import "RightSlideMenuView.h" @interface MainViewController () { RightSlideMenuView* sideMenuView_; UIView* viewForClosingSideMenu_; } - (void)viewDidLoad { [super viewDidLoad]; sideMenuView_ = [[RightSlideMenuView alloc] initWithFrame: self.view.frame]; [self.view addSubview: sideMenuView_]; } //スライドさせてメニューを表示させる - (IBAction)showSideMenu:(id)sender { // show side menu with animation CGRect sideMenuFrame = sideMenuView_.frame; [UIView animateWithDuration:0.3f delay:0.0f options:UIViewAnimationOptionCurveEaseIn animations:^{ // アニメーションをする処理 sideMenuView_.frame = CGRectMake( insideSideMenuX, sideMenuFrame.origin.y, sideMenuFrame.size.width, sideMenuFrame.size.height); } completion:^(BOOL finished) { // アニメーションが終わった後実行する処理 }]; // メニュー外をタップしたら、メニューを閉じるようにする // そのためのUIViewをメニュー外に設置し、これをタップしたらメニューを閉じるようにする if (!viewForClosingSideMenu_) { viewForClosingSideMenu_ = [[UIView alloc] initWithFrame: CGRectMake(0, 0, self.view.frame.size.width - sideMenuFrame.size.width, self.view.frame.size.height)]; viewForClosingSideMenu_.backgroundColor = [UIColor clearColor]; UITapGestureRecognizer *closeSideMenuTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeSideMenu:)]; [viewForClosingSideMenu_ addGestureRecognizer:closeSideMenuTap]; [self.view addSubview: viewForClosingSideMenu_]; } }
//メニュー外をタップしたときに呼び出されるメソッド -(void)closeSideMenu:(int)destination { CGRect sideMenuFrame = sideMenuView_.frame; [UIView animateWithDuration:0.3f delay:0.0f options:UIViewAnimationOptionCurveEaseIn animations:^{ // アニメーションをする処理 sideMenuView_.frame = CGRectMake( outsideSideMenuX, sideMenuFrame.origin.y, sideMenuFrame.size.width, sideMenuFrame.size.height); } completion:^(BOOL finished) { // アニメーションが終わった後実行する処理 }]; // メニューを閉じるためのUIViewを削除 if (viewForClosingSideMenu_) { [viewForClosingSideMenu_ removeFromSuperview]; viewForClosingSideMenu_ = nil; } }