2

问题如下:

在某个时刻,按钮的位置发生了变化。在此之后,按钮的标题也必须更改。

位置由动画(UIView 动画块)改变,当设置标题时,帧恢复到原始值(动画之前)。

所以......我该如何解决这个问题?为什么会这样?

更新代码

CGRect buttonFrame = self.button.frame;
buttonFrame.origin = CGPointMake(16, 80);
[UIView animateWithDuration:.4 animations:^{
    [self.button setFrame:buttonFrame];
}completion:^(BOOL finished){
    [self.button setTitle:@"Title" forState:UIControlStateNormal]; // can be here...
}];

不管我把 setTitle:ForState: 方法放在哪里,框架恢复到原来的值。

4

3 回答 3

5

尝试在 UIViewController 上禁用自动布局。对我来说,有时自动布局会导致一些讨厌的布局行为。特别是当我使用动画时。

编辑

如果自动布局打开,这对我有用:

[UIView animateWithDuration:.4 animations:^{
     self.button.transform = CGAffineTransformMakeTranslation(-200,-200);
}completion:^(BOOL finished) {
    [self.button setTitle:@"YourTitle" forState:UIControlStateNormal];
}];  
于 2013-08-01T14:52:09.587 回答
5

当您使用自动布局时,您不应设置任何框架。相反,如果你想改变按钮的位置,你应该将 IBOutlets 设置为 IB 中的约束并修改它们的常量。例如,如果您的按钮对屏幕的顶部和左侧有约束(我将它们称为 leftCon 和 topCon),您可以这样做:

[UIView animateWithDuration:.4 animations:^{
    self.leftCon.constant = 16;
    self.topCon.constant = 80;
    [self.view layoutIfNeeded];
}];
于 2013-08-01T15:09:14.487 回答
3

尝试使用transform而不是更改框架:

button.transform = CGAffineTransformMakeTranslation(-100,-100);

于 2013-08-01T14:54:17.877 回答