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

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

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

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

揭示一些亮点:)

【问题讨论】:

    标签: objective-c ios uiview uiviewanimation


    【解决方案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 来自右侧然后完全占据屏幕。希望你把它形象化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    相关资源
    最近更新 更多