Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么通过setTitle:forState:method重置UIButton帧_Ios_Objective C - Fatal编程技术网

Ios 为什么通过setTitle:forState:method重置UIButton帧

Ios 为什么通过setTitle:forState:method重置UIButton帧,ios,objective-c,Ios,Objective C,问题如下: 在某一时刻,按钮的位置会改变。在此之后,按钮的标题也必须更改 位置由动画(UIView动画块)更改,当设置标题时,帧返回到原始值(动画之前) 所以。。。我怎样才能解决这个问题?为什么会这样 用代码更新 CGRect buttonFrame = self.button.frame; buttonFrame.origin = CGPointMake(16, 80); [UIView animateWithDuration:.4 animations:^{ [self.button

问题如下:

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

位置由动画(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:method放在何处,帧都会恢复到原始值。

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

编辑

如果“自动布局”处于启用状态,则此选项对我有效:

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

尝试使用
transform
而不是更改帧:


button.transform=CGAffineTransformMakeTransform(-100,-100)

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

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

我怀疑在不显示代码的情况下您是否能够获得任何帮助。代码或未发生代码重复。谢谢。你在哪里设置标题?显示该代码too@TheTiger你明白我的意思。我对其他相关的UI元素使用自动布局。这不是禁用它的选项。您是否尝试过使用@Cyrille建议的转换?这可能会很好地与Autolayout配合使用。@RodrigoSalles-我得到的行为与您在尝试使用Autolayout设置帧动画时的行为相同。但是,当我在动画块内使用变换时,如果“自动布局”仍处于启用状态,则变换会正常工作。变换不会更改帧,而是在进行布局后应用。它不受自动布局或自动大小调整的影响,这就是它工作的原因@RodrigoSalles,你必须在别处有个错误,问题是我改变了其他元素的位置。和[self.view layoutifneed]重置所有帧,所有UI元素返回原始状态。更糟的是…@RodrigoSalles——如果你使用自动布局,就不应该这样做。关闭该选项,或者通过更改约束来更改所有帧。