UIButton总是回到第一个位置?

时间:2012-10-30 21:04:26

标签: iphone objective-c ios

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

我有一个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) {
                                      }];
                 }];

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

编辑(添加代码示例)

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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) {
                     }];
}

答案 2 :(得分:0)

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

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