我正在尝试创建一个类似于iPhone目标应用的菜单系统。这是菜单的样子:
我一直在网上搜索,但没有找到很多信息。据我所知,我将不得不创建一个UIView作为菜单,偏移视图并检测何时触摸它以向上滑动。菜单视图中的这些按钮必须像标签栏控制器一样加载其他视图,同时保持菜单选项卡在底部向上滑动。向上滑动菜单,点击您想去的地方的按钮,在向下滑动按钮的同时加载该视图。
动画看起来很简单,它使它的功能像标签栏控制器一样,并始终保持在视图中,以及如何检测菜单的滑动(可能是UIScrollView的东西)?
任何帮助都会很棒,不知道从哪里开始。
答案 0 :(得分:5)
最多5步包含子视图本身的创建,但是如果您只对从第5步读取的拖动事件感兴趣,那就是关于panGestureRecognizer。
创建自定义UIView,我还创建了一个委托协议,以便在子视图上发生操作时通知viewController。根据子视图的复杂程度,您可能希望创建一个具有相同名称的xib文件。我们从现在开始称它为filterView。
在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。 打开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方法可以用来检查这些变量。