IOS开发 左右弹出菜单视图 菜鸟纯代码实现思路

来源:互联网 发布:linux 禁止ip 编辑:程序博客网 时间:2024/06/11 00:45

网上看了很多关于左右弹出菜单类的效果,现在很多IOS应用都应用这种特效,一是省空间,二是符合当代年轻人的触控体验等,先不说这个,我们聊聊技术上的实现方案

我这里就不说采用第三方组件进行开发了,就单纯的用代码来实现吧


实现思路

1. 在当前视图动态创建需要弹出菜单的UIViewController ( 采用keyWindow方式添加此视图进去)

FMCountrySelectViewController *_countrySelectView;- (void)viewDidLoad{    [super viewDidLoad];    // 初始化菜单视图 我这里采用StoryBoard的方式寻找视图    _countrySelectView = [[UIStoryboard storyboardWithName:@"Storyboard" bundle:nil] instantiateViewControllerWithIdentifier:@"CountrySelectView"] ;//[[FMCountrySelectViewController alloc] init];    [_countrySelectView.view setFrame:CGRectMake(320, 0, _countrySelectView.view.frame.size.width, _countrySelectView.view.frame.size.height)];    [[UIApplication sharedApplication].keyWindow addSubview:_countrySelectView.view];}

2.控制好视图的frame(当前View包括 View 和 NavigationBar )

// 显示切换菜单帅选视图-(void)showCountrySelectView{        // 判断菜单视图是否出来了    CGFloat isX = _countrySelectView.view.frame.origin.x;    // 把当前视图赋值给countrySelectView    _countrySelectView._indexNewsView = self;    if (isX==self.view.frame.size.width) {        // 没有推出则进行推出动画        [self pushCountryView];    }else{        // 否则还原        [self popCountryView];    }    }// 推出菜单视图- (void) pushCountryView{    //给将出来的视图加阴影    layer = _countrySelectView.view.layer;    layer.shadowColor = [UIColor blackColor].CGColor;    layer.shadowOffset = CGSizeMake(1, 1);    layer.shadowOpacity = 1.0;    layer.shadowRadius = 20.0;    // 添加动画    [UIView beginAnimations:nil context:Nil]; // 开始动画    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];// 设置动画类型    // 菜单视图推出来60个像素    CGFloat movePix = 60;    [_countrySelectView.view setFrame:CGRectMake(_countrySelectView.view.frame.size.width-movePix, _countrySelectView.view.frame.origin.y, _countrySelectView.view.frame.size.width, _countrySelectView.view.frame.size.height)];    // 原视图向左退60,包括导航视图    [self.view setFrame:CGRectMake(-movePix, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height)];    [self.navigationController.navigationBar setFrame:CGRectMake(-movePix, self.navigationController.navigationBar.frame.origin.y, self.navigationController.navigationBar.frame.size.width, self.navigationController.navigationBar.frame.size.height)];    [UIView commitAnimations];    }// 还原菜单视图,还原为原始布局- (void) popCountryView{        // 添加动画    [UIView beginAnimations:nil context:Nil]; // 开始动画    [UIView setAnimationDelegate:self];    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];// 设置动画类型    [UIView setAnimationDidStopSelector:@selector(overMoved)]; //动画完成执行    // 恢复原状    CGFloat movePix = 0;    [_countrySelectView.view setFrame:CGRectMake(_countrySelectView.view.frame.size.width, _countrySelectView.view.frame.origin.y, _countrySelectView.view.frame.size.width, _countrySelectView.view.frame.size.height)];    // 原视图向右退回原位,包括导航视图    [self.view setFrame:CGRectMake(movePix, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height)];    [self.navigationController.navigationBar setFrame:CGRectMake(movePix, self.navigationController.navigationBar.frame.origin.y, self.navigationController.navigationBar.frame.size.width, self.navigationController.navigationBar.frame.size.height)];        [UIView commitAnimations]; }// 这个是动画完成后执行的,让菜单视图的阴影去掉- (void)overMoved{    NSLog(@"动画完成");    layer.shadowOpacity = 0;}

实现的效果如下:




0 0