通过滑动 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 我想这是一个好的开始。但是,我想要的与此略有不同。您可以将其视为 ios 的 Notification 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的主要内容,如果未能解决你的问题,请参考以下文章