iOS上滑菜单

时间:2012-10-18 16:55:36

标签: ios menu

我正在尝试创建一个类似于iPhone目标应用的菜单系统。这是菜单的样子:

http://www.iclarified.com/images/news/24601/92487/92487.jpg http://www.iclarified.com/images/news/24601/92487/92487.jpg

我一直在网上搜索,但没有找到很多信息。据我所知,我将不得不创建一个UIView作为菜单,偏移视图并检测何时触摸它以向上滑动。菜单视图中的这些按钮必须像标签栏控制器一样加载其他视图,同时保持菜单选项卡在底部向上滑动。向上滑动菜单,点击您想去的地方的按钮,在向下滑动按钮的同时加载该视图。

动画看起来很简单,它使它的功能像标签栏控制器一样,并始终保持在视图中,以及如何检测菜单的滑动(可能是UIScrollView的东西)?

任何帮助都会很棒,不知道从哪里开始。

3 个答案:

答案 0 :(得分:5)

最多5步包含子视图本身的创建,但是如果您只对从第5步读取的拖动事件感兴趣,那就是关于panGestureRecognizer。

  1. 创建自定义UIView,我还创建了一个委托协议,以便在子视图上发生操作时通知viewController。根据子视图的复杂程度,您可能希望创建一个具有相同名称的xib文件。我们从现在开始称它为filterView。

  2. 在filterView上创建两个方法,如“hide”和“show”。如果您不想要一个按钮(即带箭头的小按钮,我将其称为dropdownButton)来关闭并打开filterView,您可以跳过此步骤,但我强烈建议您实施它们。您需要做的是将filterView.frame.origin.y设置为

    • [[UIScreen mainScreen] bounds] .size.height - dropDownButton.frame.height隐藏filterView

    • [[UIScreen mainScreen] bounds] .size.height - filterView.frame.size.height来显示它。

  3. 如果需要,我也可以发送该动画的代码。

    3。  打开UIViewController的xib文件并添加UIView,以便只显示其下拉按钮。单击视图,使用界面构建器中最右侧的窗格将其类更改为filterView。在此步骤中,如果您正确执行了所有操作,您应该能够在页面底部看到filtersView的提示。如果没有,filterView.xib文件可能没有正确连接到filterView源代码文件。

    4 。  在ViewController中导入FilterView并以IBOutlet& amp;合成它。如果您已经编写了委托协议,请实施委托协议。如果filterView上有按钮,稍后您将需要它。委托协议应包括可选的消息,如

    -(void) featuresButtonTappedOnFilterView: (FilterView *) filterView;
    

    在实现中你应该在viewController中做你必须做的事情,比如打开另一个viewController。

    5 。在viewControllers xib文件中创建 panGestureRecognizer 并将其添加到filterView。 PanGestureRecognizer是一个gestureRecognizer,它将处理拖动事件。首先,整个filterView将能够通过点击它上面的任何一点来拖动,我们将在稍后进行。将gestureRecognizer连接为IBOutlet并创建一个IBAction(最好使用更好的名称),如:

    -(IBAction)_panRecogPanned:(id)sender;
    

    在ViewController的viewDidLoad方法中,不要忘记将委托设置为:

    [_panRecog setDelegate:self];
    

    6 。实现其他状态以获得更多权力。但是stateChanged起初就足够了。

    - (IBAction)_panRecogPanned:(id)sender {
    
        switch ([(UIPanGestureRecognizer*)sender state]) {
    
    
        case UIGestureRecognizerStateBegan: { } break;
        case UIGestureRecognizerStateChanged: {
    
           if ( [((UIPanGestureRecognizer *)sender) locationInView:_filterView].y > dropDownButton.frame.height ) 
                return; // Only drag if the user's finger is on the button
    
            CGPoint translation = [_panRecog translationInView:filterView];
    
          //Note that we are omitting translation.x, otherwise the filterView will be able to move horizontally as well. Also note that that MIN and MAX were written for a subview which slides down from the top, they wont work on your subview.
            CGRect newFrame = _panRecog.view.frame;
            //newFrame.origin.y = MIN (_panRecog.view.frame.origin.y + translation.y, FILTER_OPEN_ORIGIN_Y);
            //newFrame.origin.y = MAX (newFrame.origin.y, FILTER_INITIAL_ORIGIN_Y);
            newFrame.origin.y = _panRecog.view.frame.origin.y + translation.y;
            _panRecog.view.frame = newFrame;
    
            [_panRecog setTranslation:CGPointMake(0, 0) inView:self.view];
    
    
        } break;
    
        //Remember the optional step number 2? We will use hide/ show methods now:
        case UIGestureRecognizerStateEnded:
        case UIGestureRecognizerStateCancelled: {
    
        //CGPoint velocity = [_panRecog velocityInView:_panRecog.view];
        //Bonus points for using velocity when deciding what to do when if the user lifts his finger
    
            BOOL open;
    
            /*
            if (velocity.y < -600.0) {
                open = NO;
            }
    
            else if (velocity.y >= 600.0) {
                open = YES;
            } else
            */
    
            if ( _panRecog.view.frame.origin.y > (FILTER_OPEN_ORIGIN_Y + FILTER_INITIAL_ORIGIN_Y) / 2 ) {
                open = YES;
            }
    
            else {
                open = NO;
            }
    
    
            if (open == YES) { 
    
                [_filterView show];
            }
    
            else {      
                [_filterView hide];
    
            }
    
        } break;
    
        default:
            break;
    }
    

    }

    注意:我的过滤器视图位于页面顶部而不是底部,因为子视图将移出页面边框。注释掉MAX和MIN语句以解决这个问题,我自己懒得写它们。复制和粘贴后代码会被修改,它可能(也可能会)包含拼写错误。

答案 1 :(得分:2)

我认为你试图让它变得太复杂 - 只需要以这样的方式制作视图和位置,使其大部分不在屏幕上,只显示一个提示。当您触摸提示时,将视图移动到完全可见,并将该移动放在动画块中。

菜单项可能只是UIButtons,在该视图上有自定义图形。

答案 2 :(得分:0)

不要认为复杂,逻辑很简单。设置其高度和宽度,使其离开屏幕。试试这种方法,然后给出你的反馈。检查http://blogsbits.com此方法会有所帮助。 hit和try方法可以用来检查这些变量。