1

我在情节提要中设置了一个 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");

    }
4

3 回答 3

1
-(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];
}
于 2012-11-18T15:17:04.007 回答
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 值,然后当按下按钮时,它将执行另一个方法。我发现这比一次完成所有操作更干净。祝你好运。

于 2012-11-18T17:58:07.747 回答
1

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

在 .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;
   }

希望它对你有用。谢谢

于 2012-11-18T19:00:20.810 回答