2014-10-29 73 views
0

我正在创建一个小滑出菜单而不使用任何库。通过使用UIDynamics,我可以通过单击IBAction按钮来滑动打开菜单。打开/关闭菜单条件

我想问一下,如何通过点击相同的btn来关闭菜单。点击另一个btn可以关闭菜单,例如菜单中的“关闭”btn,但我也想通过点击打开它的相同菜单btn来关闭它。

这是显示菜单

-(BOOL)showMenu:(BOOL)yesNO{ 

    //cleaning the screen of any behaviors 
    [self.animator removeAllBehaviors]; 

    //animation will go from side to side 
    CGFloat graxityDirectionX = (yesNO) ? 0.1 : -1.0; 

    //detecting the collision of the menu 
    CGFloat collision = (yesNO) ? menuWidth : -menuWidth; 

    //insitating the gravity and telling it work on the menu 
    UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[self.menuView]]; 

    gravity.gravityDirection = CGVectorMake(graxityDirectionX, 0); 

    //adding the animation 
    [self.animator addBehavior:gravity]; 

    //instaniating the collision and telling the menu were to stop 
    UICollisionBehavior *collisionMenu = [[UICollisionBehavior alloc] initWithItems:@[self.menuView]]; 

    //telling the menu where and what to collide it by using an invisible line 
    [collisionMenu addBoundaryWithIdentifier:@"menuBoundry" fromPoint:CGPointMake(collision, 580) toPoint:CGPointMake(collision, 0)]; 

    //adding the collision 
    [self.animator addBehavior:collisionMenu]; 

    //setting the bounce 
    UIDynamicItemBehavior *menuBounce = [[UIDynamicItemBehavior alloc]initWithItems:@[self.menuView]]; 
    menuBounce.elasticity = 0; 
    [self.animator addBehavior:menuBounce]; 

    return YES; 
} 

的功能,这是我怎么在IBAction为

- (IBAction)menuAction:(id)sender { 
    [self showMenu:YES]; 
} 

我尝试了多种不同类型的if语句调用它,但我不能让它关闭。

请帮忙。

在此先感谢

+0

您是否尝试过使用存储的菜单是否显示或不显示状态的变量?或者,您是否可以返回您可以致电的信息? – Abizern 2014-10-29 08:35:22

+0

对于菜单状态的状态你是什么意思? 使用-menuWidth和动画在中间滑动,菜单从视图中隐藏。 – 2014-10-29 09:57:17

+0

已尝试使用按钮的“selected”状态进行操作? – holex 2014-10-29 11:19:04

回答

5

我误解了动态行为。好的,我建议为此使用BOOL。声明BOOL

BOOL isMenuVisible; 

,然后用它在IBAction为

- (IBAction)menuAction:(id)sender { 
    if(isMenuVisible == NO){ 
     self.isMenuVisible = YES; 
     [self showMenu:self.isMenuVisible]; 
    }else{ 
     self.isMenuVisible = NO; 
     [self showMenu:self.isMenuVisible]; 
    } 
} 
+0

较短的版本:'self.isMenuVisible =!self.isMenuVisible; [self showMenu:self.isMenuVisible];' – Cyrille 2014-10-29 13:44:53

+0

谢谢你们!问题解决了! 有一件事我想问。当我在IBAction方法中添加“BOOL isMenuVisible”时,菜单不起作用,但是当我在界面部分声明它时,它完美地工作。为什么我在IBAction中宣布它不起作用? – 2014-10-29 15:00:31

+0

因为当方法完成时它超出了范围。 – Abizern 2014-10-30 08:03:11

0

不要使用布尔值来执行此任务。由于您的方法“showMenu”中有菜单宽度。将类级属性分配给它的菜单宽度。在你的方法“menuAction”中应用一个支票。如果菜单宽度大于0,则意味着您必须关闭它。如果它小于零意味着它意味着你必须展示它。

+0

我已经定义了menuWidth在导入声明后,全球首位。你说不要使用布尔,我应该改变布尔在“showMenu”mtd无效? 另外menuWidth被设置为-ve,这样它就不会出现在视图中,而它正在滑动的动画中。所以如何检查menuWidth是否已经被修复? – 2014-10-29 10:37:38

相关问题