看过看多的侧视图 还是发现Uber的侧拉视图看着效果比较好一点 而且体验还是比较好的
有蒙版 有侧视图 我只能说这是一个ScrollView!!!而且底部是一个地图的话滑动手势需要处理这里用的额就是一个边缘手势!!以前的文章介绍过这个手势……
//设置边缘手势
-(void)setLeftView{
self.leftView = [[LeftMenuView alloc]initWithFrame:self.view.bounds];
// self.leftView.menuDelegate = self;
UIScreenEdgePanGestureRecognizer *edgeGesture = [[UIScreenEdgePanGestureRecognizer alloc]initWithTarget:self action:@selector(handleGesture:)];
edgeGesture.edges = UIRectEdgeLeft;
edgeGesture.delegate = self;
[self.view addGestureRecognizer:edgeGesture];
}
- (void)handleGesture:(UIScreenEdgePanGestureRecognizer *)gesture
{
if(UIGestureRecognizerStateBegan == gesture.state)
{
[self.navigationController.view addSubview:_leftView];
}
else if(UIGestureRecognizerStateChanged == gesture.state)
{
// 根据被触摸手势的view计算得出坐标值
CGPoint translation = [gesture translationInView:gesture.view];
if (translation.x<_leftView.sideOffset)
{
_leftView.contentOffset = CGPointMake(_leftView.sideOffset-translation.x, 0);
}
}
else
{
CGPoint translation = [gesture translationInView:gesture.view];
if (translation.x<_leftView.sideOffset/2)
{
[UIView animateWithDuration:0.3 animations:^{
_leftView.contentOffset = CGPointMake(_leftView.sideOffset, 0);
}completion:^(BOOL finished) {
[_leftView removeFromSuperview];
}];
}
else
{
[UIView animateWithDuration:0.3 animations:^{
[_leftView openLeftView:NO];
}];
}
}
}
#pragma mark - GestureRecognizer Delegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
if ([gestureRecognizer isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) {
return YES;
}
return NO;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
if ([gestureRecognizer isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) {
return YES;
}
return NO;
}
这个视图一定是加在导航控制器的View上面的否则导航栏是遮不住的
侧视图需要实现的方法 具体看自己需要:
#pragma mark - scrollView
- (void)closeSideView:(BOOL)animated
{
[UIView animateWithDuration:0.3 animations:^{
self.contentOffset = CGPointMake(self.sideOffset, 0);
}completion:^(BOOL finished) {
[self removeFromSuperview];
}];
}
- (void)openLeftView:(BOOL)animated
{
[self setContentOffset:CGPointMake(0, 0) animated:animated];
}
- (void)arrangeViews:(UIScrollView *)scrollView
{
if (scrollView.contentOffset.x<self.sideOffset/2)
{
[self openLeftView:YES];
}
else
{
[self closeSideView:YES];
}
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if (!decelerate){
[self arrangeViews:scrollView];
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
[self arrangeViews:scrollView];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
_alphaView.alpha = (1-self.defaultAlpha)*(self.sideOffset-scrollView.contentOffset.x)/self.sideOffset;
}
- (void)dismissLeftView:(UITapGestureRecognizer *)tap
{
[self closeSideView:YES];
}
在这里说一个技巧就是不用代理就能执行的push推出视图!!!!
id next = self.nextResponder.nextResponder;
UINavigationController *nav = (UINavigationController*)next;
在响应链中一次找到 导航控制器 就可以PUSH