通过滑动 UIView 滑出导航以覆盖另一个 UIView

Posted

技术标签:

【中文标题】通过滑动 UIView 滑出导航以覆盖另一个 UIView【英文标题】:Slide out navigation through swipes for UIView to overlay another UIView 【发布时间】:2012-08-22 04:10:13 【问题描述】:

在我对这种导航技术的研究中,我发现this post by Nick Harris 我想这是一个好的开始。但是,我想要的与此略有不同。您可以将其视为 iosNotification Center,您只需从顶部滑动即可显示 view,然后只需向后滑动即可再次隐藏它。就我而言,我希望通过向左滑动手势显示来自屏幕右侧的隐藏UIView,并通过相同的手势再次隐藏它(这次是向右)。

我已经设法在我之前的post 上找到了一个关于显示/隐藏 UIView 的解决方案。我想补充的一件事是滑动手势。

我不想像 Nick Harris 所做的那样调整我的应用程序委托来执行此操作。因此,如果有人对我如何做到这一点有任何想法/代码示例,我将不胜感激。

揭示一些亮点:)

【问题讨论】:

【参考方案1】:

您可以通过向左滑动手势显示来自屏幕右侧的隐藏 UIView,也可以通过相同手势再次隐藏它(这次是向右)。添加过渡。

在 .h 文件中添加 BOOL didNotSwipe 在 .m 文件 viewDidLoad 方法中添加其值 didNotSwipe = TRUE

为您的 self.view 添加具有不同选择器的左右方向的滑动手势。

 UISwipeGestureRecognizer *recognizer;
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRight:)];
[recognizer setDirection:UISwipeGestureRecognizerDirectionRight];
[[self view] addGestureRecognizer:recognizer];
[recognizer release]; 

UISwipeGestureRecognizer *recognizer1;
recognizer1 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeleft:)];
[recognizer1 setDirection:UISwipeGestureRecognizerDirectionLeft];
[[self view] addGestureRecognizer:recognizer1];
[recognizer1 release]; 

当向左滑动时调用此方法:

 -(void)swipeleft:(UISwipeGestureRecognizer *)swipeGesture 
 
   if (didNotSwipe) 
     didNotSwipe = FALSE;
     CATransition *animation = [CATransition animation];
     [animation setDelegate:self];
     [animation setType:kCATransitionPush];
     [animation setSubtype:kCATransitionFromRight];
     [animation setDuration:0.50];
     [animation setTimingFunction:
     [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
     [self.view.layer addAnimation:animation forKey:kCATransition];
     [self.view addSubView:self.overlayView];
     //[self.overlayView setFrame:CGRectMake(0,0,self.overlayView.frame.size.width,self.overlayView.frame.size.height)];
   
 

当向右滑动此方法时:

 -(void)swipeRight:(UISwipeGestureRecognizer *)swipeGesture
 
   if(!didNotSwipe)
     didNotSwipe = TRUE;
     CATransition *animation = [CATransition animation];
     [animation setDelegate:self];
     [animation setType:kCATransitionPush];
     [animation setSubtype:kCATransitionFromLeft];
     [animation setDuration:0.40];
     [animation setTimingFunction:
     [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
     [self.view.layer addAnimation:animation forKey:kCATransition];
     [self.overlayView removeFromSuperView];
   
 

【讨论】:

Halu,我已经尝试过这段代码了。对于我向右滑动时的反馈,覆盖视图效果很好。但是当我再次向右滑动时,覆盖视图会消失片刻,然后再次出现。接下来,当我向左滑动时,覆盖视图突然消失得如此之快。即使我将动画的持续时间设置为 2.5,覆盖视图仍然会快速消失。 在 vieDidLoad 中添加一个最初为真的标志。现在在向右滑动方法 if(flag) flag = FALSE;所有其他代码在这里。现在向左滑动标志 = TRUE;这仅在任何方向滑动一次 EDIT 来自我在这里的第一条评论:Halu,我已经尝试过这段代码。对于向左滑动时的反馈,叠加视图效果很好。但是当我再次向左滑动时,覆盖视图会消失片刻,然后再次出现。接下来,当我向右滑动时,覆盖视图突然消失得如此之快。即使我将动画的持续时间设置为 2.5,覆盖视图仍然会快速消失。 我已经添加了标志,关于您的建议,我只是将 if(flag) 条件更改为向左滑动方法,在向右滑动方法中我将标志设置为 TRUE。但是,它并不能解决问题。 带有flag的UI行为反馈:第一次向左滑动是好的,UIView从屏幕右侧走,之后完全占据屏幕动画时长,太棒了!但是当我向右滑动时, UIView 消失得如此之快,并且没有显示正在发生的动画。接下来当我再次向左滑动时,一个 UIView 来自屏幕左侧然后消失,然后另一个 UIView 来自屏幕右侧,消失,另一个 UIView 来自右侧然后完全占据屏幕。希望你把它形象化。

以上是关于通过滑动 UIView 滑出导航以覆盖另一个 UIView的主要内容,如果未能解决你的问题,请参考以下文章

快速滑出菜单而不滑动导航栏(以编程方式)

iOS从另一个视图的一侧滑动一个UIView(菜单)

识别 UIView 中的滑动手势以使用手势识别器滚动滚动视图

从页面顶部滑动导航菜单 - Jquery

单击不起作用的滑出菜单栏

Android 中的两部分过渡动画:将一个 textview 向左滑出,并从右侧引入另一个