为什么UIButton帧由setTitle:forState:方法重置

时间:2013-08-01 14:42:49

标签: ios objective-c

问题如下:

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

通过动画(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:方法,将帧恢复为原始值。

3 个答案:

答案 0 :(得分:5)

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

修改

如果Autolayout开启,这对我有用:

[UIView animateWithDuration:.4 animations:^{
     self.button.transform = CGAffineTransformMakeTranslation(-200,-200);
}completion:^(BOOL finished) {
    [self.button setTitle:@"YourTitle" forState:UIControlStateNormal];
}];  

答案 1 :(得分:4)

使用自动布局时,不应设置任何帧。相反,如果要更改按钮的位置,则应将IBOutlet设置为IB中的约束并修改其常量。例如,如果你的按钮对屏幕的顶部和左侧有一个约束(我将它们称为leftCon和topCon),你可以这样做:

[UIView animateWithDuration:.4 animations:^{
    self.leftCon.constant = 16;
    self.topCon.constant = 80;
    [self.view layoutIfNeeded];
}];

答案 2 :(得分:2)

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

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