0

我有这个头发拉扯的问题,我希望任何人都能够帮助我。这似乎是一件小事,但我一直无法找到任何解决方案。

我有一个 UIButton,我想用动画块四处移动。每次单击按钮时,我都会将其移动到新位置,按钮总是移动到正确的位置,问题是它总是从第一个位置移动到新位置。

假设我有一个按钮,(0,0)然后将其移动到(0,50)像美女一样工作!现在我想将按钮移动到(0,100),我希望它从到动画(0,50)(0,100)但是它从(0,0)到动画,(0,100)所以它最终在正确的位置,但从错误的位置移动。

UIButton通过在动画块中设置一个新帧来移动

[UIView animateWithDuration:0.5f
                              delay:0.0f
                            options:UIViewAnimationCurveLinear
                         animations:^{
                         }
                         completion:nil];

在我的情况下,当其他控件完成移动时,我将按钮移动到完成块中。

我真的希望有人知道我在说什么并为我解答。

我用于为 uibutton 设置动画的代码是这样的,按钮名称是“btnAddPhoneNumber”,它也是“发送者”

[UIView animateWithDuration:1
                      delay:0
                    options:UIViewAnimationCurveLinear
                 animations:^{
                     txtNewPhoneNumber.frame = CGRectMake(newXnumber, newYnumber, txtPhoneNumber.frame.size.width, txtPhoneNumber.frame.size.height);

                 }
                 completion:^(BOOL finished) {
                     txtNewPhoneNumber.placeholder = @"here you go!";

                     //animate add textfield button.
                     [UIView animateWithDuration:0.5f
                                           delay:0
                                         options:UIViewAnimationCurveLinear
                                      animations:^{



                                          [sender setFrame:CGRectMake(btnAddPhoneNumber.frame.origin.x, newYnumber, btnAddPhoneNumber.frame.size.width, btnAddPhoneNumber.frame.size.height)];

                                          txtNewPhoneNumberTitle.frame = CGRectMake(newXtitle, newYtitle, txtPhoneNumberTitle.frame.size.width, txtPhoneNumberTitle.frame.size.height);

                                          [btnDelete setFrame:btnDeleteRect];
                                      }
                                      completion:^(BOOL finished) {
                                      }];
                 }];

感谢您阅读我的问题,并帮助我找到解决方案。

编辑(添加代码示例)

4

3 回答 3

0

我发现了问题,视图使用了 AutoLayout,当我删除 AutoLayout 中的勾号时,我的按钮的新位置被保存,下一个动画从以前的位置继续。

感谢 ACB 和 Tobi 的投入,他们帮助我尝试了不同的解决方案,最终解决了问题!

于 2012-11-01T12:58:47.543 回答
0

尝试添加UIViewAnimationOptionBeginFromCurrentState第二个动画的选项,看看它是否解决了您的问题。

[UIView animateWithDuration:0.5f
                              delay:0.0f
                            options:UIViewAnimationCurveLinear | UIViewAnimationOptionBeginFromCurrentState
                         animations:^{
                         }
                         completion:nil];

另一种方法是在第二个动画的完成处理程序中再次设置按钮的框架(设置相同的值)。

于 2012-10-30T21:16:59.640 回答
0

检查这项工作。正如我在评论中提到的,您可以将其用作最后的选择。不是推荐的方法。

[UIView animateWithDuration:1
                      delay:0
                    options:UIViewAnimationCurveLinear
                 animations:^{
                     txtNewPhoneNumber.frame = CGRectMake(newXnumber, newYnumber, txtPhoneNumber.frame.size.width, txtPhoneNumber.frame.size.height);

                 }
                 completion:^(BOOL finished) {
                     txtNewPhoneNumber.placeholder = @"here you go!";

                     [self performSelector:@selector(callSecondAnimation) withObject:nil afterDelay:1.5f)]; //or 0.5f
                 }];

- (void)callSecondAnimation {
    //animate add textfield button.
    [UIView animateWithDuration:0.5f
                          delay:0
                        options:UIViewAnimationCurveLinear
                     animations:^{

                         [sender setFrame:CGRectMake(btnAddPhoneNumber.frame.origin.x, newYnumber, btnAddPhoneNumber.frame.size.width, btnAddPhoneNumber.frame.size.height)];

                         txtNewPhoneNumberTitle.frame = CGRectMake(newXtitle, newYtitle, txtPhoneNumberTitle.frame.size.width, txtPhoneNumberTitle.frame.size.height);

                         [btnDelete setFrame:btnDeleteRect];
                     }
                     completion:^(BOOL finished) {
                     }];
}

更新:

先试试这个

[UIView animateWithDuration:1
                      delay:0
                    options:UIViewAnimationCurveLinear
                 animations:^{
                     txtNewPhoneNumber.frame = CGRectMake(newXnumber, newYnumber, txtPhoneNumber.frame.size.width, txtPhoneNumber.frame.size.height);

                 }
                 completion:^(BOOL finished) {
                     txtNewPhoneNumber.placeholder = @"here you go!";
                     txtNewPhoneNumber.frame = CGRectMake(newXnumber, newYnumber, txtPhoneNumber.frame.size.width, txtPhoneNumber.frame.size.height);//try setting it here once and then call next one
                     [self callSecondAnimation];
                 }];

- (void)callSecondAnimation {
    //animate add textfield button.
    [UIView animateWithDuration:0.5f
                          delay:0
                        options:UIViewAnimationCurveLinear
                     animations:^{

                         [sender setFrame:CGRectMake(btnAddPhoneNumber.frame.origin.x, newYnumber, btnAddPhoneNumber.frame.size.width, btnAddPhoneNumber.frame.size.height)];

                         txtNewPhoneNumberTitle.frame = CGRectMake(newXtitle, newYtitle, txtPhoneNumberTitle.frame.size.width, txtPhoneNumberTitle.frame.size.height);

                         [btnDelete setFrame:btnDeleteRect];
                     }
                     completion:^(BOOL finished) {
                     }];
}
于 2012-10-30T21:48:28.817 回答