所以我有一个非常简单的按钮,当点击进入全屏时再次点击它会回到它最初所处的相同位置。出于某种原因,它在没有动画的情况下完美运行。当我最初点击按钮时取消注释动画部分它什么也没做,第二次我点击它稍微放大。我第三次点击它动画缓慢但回到原来的尺寸较小......为什么它以相反的方式制作动画?
- (IBAction)viewImage1:(id)sender {
UIButton *btn = (UIButton*) sender;
if (btn.tag == 0)
{
CGRect r = [[UIScreen mainScreen] bounds];
/*[UIView animateWithDuration:0.5f delay:0.0f options:0 animations:^{*/
[sender setFrame: r];
/*}completion:nil];*/
btn.tag = 1;
}
else
{
btn.tag = 0;
[sender setFrame:CGRectMake(0,0,370,200)];
}
}
答案 0 :(得分:2)
您的问题有两种解决方案可以使用:
禁用Autolayout。 (泄气)
您可以通过打开文件检查器在Interface Builder中执行此操作
在右侧窗格中取消选中相应的复选框。
但是,如果您想使用Autolayout来约束视图中的其他UI元素(在大多数情况下这是一个非常好的主意),这种方法将不起作用,这就是我推荐第二种解决方案的原因:
启用Autolayout,在视图控制器中为按钮创建一个插座并设置
self.myButton.translatesAutoresizingMaskIntoConstraints = YES;
在视图控制器的viewDidLoad
方法中。
您还可以为按钮添加布局约束并为其设置动画。 (这篇优秀Stackoverflow post解释了它是如何完成的。)
这种棘手行为的原因是,一旦启用Autolayout,视图的框架就不再与屏幕上显示的实际布局相关,只有视图的布局限制很重要。将其translatesAutoresizingMaskIntoConstraints
属性设置为YES
会导致系统自动为您的视图创建布局约束,以便以说话的方式“模拟”您设置的框架。
答案 1 :(得分:0)
使用自动布局和约束更容易实现此目的。为你的按钮调用高度约束创建一个IBOutlet就像btnHeight。对宽度约束执行相同的操作,将其称为btnWidth。然后像这样创建一个IBAction:
- (IBAction)buttonPress:(UIButton *)sender {
UIButton *btn = (UIButton *) sender;
CGRect r = [[UIScreen mainScreen] bounds];
if (CGRectEqualToRect(btn.frame, CGRectMake(0.0, 0.0, 370, 200))) {
[UIView animateWithDuration:0.5 delay:0.0 options:0 animations:^{
self.btnHeight.constant = r.size.height;
self.btnWidth.constant = r.size.width;
[self.view layoutIfNeeded];
} completion:^(BOOL finished){
}];
}else{
[UIView animateWithDuration:0.5 delay:0.0 options:0 animations:^{
self.btnHeight.constant = 200.0;
self.btnWidth.constant = 370.0;
[self.view layoutIfNeeded];
} completion:^(BOOL finished){
}];
}
}
根据我的经验,动画UIButton的框架效果不佳,我知道的唯一方法是使用CGAffineTransformScale,它会光栅化按钮的标题并对其进行缩放。 / p>