问题如下:
在某个时刻,按钮的位置会发生变化。在此之后,也必须更改按钮的标题。
通过动画(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:方法,将帧恢复为原始值。
答案 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);