UIButton 动作

Posted

技术标签:

【中文标题】UIButton 动作【英文标题】:UIButton actions 【发布时间】:2012-11-18 11:46:34 【问题描述】:

我在情节提要中设置了一个 UIButton,当按下它时,它会为 UIVIew 设置动画。我希望在第二次按下 UIView 时,使用相同的按钮将其设置为动画/移动回原点。

最好的方法是什么?

感谢任何帮助或指点。

这是我用来动画和移动 UIVIew 的代码:

我正在使用一个名为 buttonCurrentStatus 的 BOOL。

-(IBAction)sortDeals:(UIButton*)sender 

if (buttonCurrentStatus == NO)

    buttonCurrentStatus = YES;

CGRect menuTopFrame = self.menuTop.frame;
menuTopFrame.origin.y = 30;


[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelay:0.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

self.menuTop.frame = menuTopFrame;

[UIView commitAnimations];
    NSLog(@"Sort Deals touched button status = yes");


 else 
        buttonCurrentStatus = NO;

        CGRect menuTopFrame = self.menuTop.frame;
        menuTopFrame.origin.y = 30;


        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.5];
        [UIView setAnimationDelay:0.0];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

        self.menuTop.frame = menuTopFrame;

        [UIView commitAnimations];


NSLog(@"Sort Deals touched button status = no");

    

【问题讨论】:

CGRect ivar 不够保留最后一帧? 我不明白。你有一个正确设置的例子吗?我真的很想学习如何在第一次触摸时让按钮执行一个动作,然后在第二次触摸时执行不同的动作。谢谢 我的意思是你可以使用一个CGRect类变量来临时存储最后一帧。然后,当您重新点击按钮时,只需将按钮位置重置为使用的最后一帧。否则,如果结束帧始终相同,请检查 sender.frame 并根据您的要求重置帧。 (对不起,我在 iPad 上,如果没有人回答你,我会尽快做)。 @hanumanDev 您可以使用 BOOL 来存储当前状态并在每次按下按钮时翻转 bool。 等我回家再给你一个代码示例,如果到时候没人有的话。 【参考方案1】:

另一种更通用的方法是使用将执行两种方法之一的 IBAction。与之前的答案一样,您可以使用 BOOl 值或 int 来确定要使用的操作。这是一个更通用的答案,可用于多种用途。

首先,您需要一个 BOOL 变量。对于这个例子,我将 Bool 变量设置为 boolVarible(是的,我知道我拼错了)。默认情况下,我将其设置为 YES。

bool boolVarible = YES;

我把它变成了一个类变量。

-(IBAction)buttonAction:(id)sender 
    if (boolVarible == YES)
    
        //Execute first action
        [self firstAction];
    
    else
    
        //Execute second action
        [self secondAction];
    


-(void)firstAction 
    //Do something here...


-(void)secondAction 
    //Do something here...

希望你能明白。然后,您可以随时交换操作。只需简单地更改 BOOl 值,然后当按下按钮时,它将执行另一个方法。我发现这比一次完成所有操作更干净。祝你好运。

【讨论】:

【参考方案2】:
-(IBAction)sortDeals:(UIButton*)sender 

sender.selected = !sender.selected;

int moveby = (sender.selected) ? 30: -30;

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelay:0.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
menuTop.frame = CGRectMake(menuTop.frame.origin.x, menuTop.frame.origin.y + moveby, menuTop.frame.size.width, menuTop.frame.size.height);
[UIView commitAnimations];

【讨论】:

【参考方案3】:

您的问题的非常简单的解决方案是,如果您在需要实现此方法的类中声明两个布尔变量。您的代码将如下所示

在.m文件中

BOOL Action1;
BOOL Action2;

现在在 ViewDidload 方法中

 (void)viewDidLoad 
 
   Action1=TRUE;
   Action2=FALSE;
   [super viewDidLoad];

  

现在你的方法

  (IBAction)sortDeals:(UIButton*)sender 
   if (Action1 == TRUE)
 

   CGRect menuTopFrame = self.menuTop.frame;
   menuTopFrame.origin.y = 30;
   [UIView beginAnimations:nil context:nil];
   [UIView setAnimationDuration:0.5];
   [UIView setAnimationDelay:0.0];
   [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
   self.menuTop.frame = menuTopFrame;
   [UIView commitAnimations];
   NSLog(@"Sort Deals touched button status = yes");
     Action1=FALSE;
     Action2=TRUE;
    
   else 
    if (Action2 == TRUE)
   

   CGRect menuTopFrame = self.menuTop.frame;
    menuTopFrame.origin.y = 30;
   [UIView beginAnimations:nil context:nil];
   [UIView setAnimationDuration:0.5];
    [UIView setAnimationDelay:0.0];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    self.menuTop.frame = menuTopFrame;
   [UIView commitAnimations];
   NSLog(@"Sort Deals touched button status = no");
   Action1=TRUE;
   Action2=FALSE;
   

希望它对你有用。谢谢

【讨论】:

以上是关于UIButton 动作的主要内容,如果未能解决你的问题,请参考以下文章

自定义动画后的 UIButton 动作

UIButton 动作不起作用

UIButton 动作

UIButton 和动作问题

点击 UIButton 时没有发生动作

3d 触摸快速动作调用 UIButton