我有这个头发问题,我希望任何人都能帮助我。这似乎是一件小事,但我找不到任何解决方案。
我有一个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) {
}];
}];
感谢您阅读我的问题,并帮助我找到解决方案。
编辑(添加代码示例)
答案 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的投入,他们帮助我尝试了不同的解决方案,最终解决了这个问题!