设置UIButton背景图像将停止动画



我试图在动画完成时设置背景图像,基本上它可以防止动画发生。这是动画的代码:

[UIView animateWithDuration: 0.5f animations: ^
{
//[buttonPanel setBackgroundImage: [UIImage imageNamed: imageName] forState: UIControlStateNormal];
CGFloat yOrigin = buttonFrame.origin.y - (self.bounds.size.height - buttonFrame.size.height);
yOrigin -= buttonFrame.size.height;
buttonPanel.frame = CGRectMake(buttonFrame.origin.x, yOrigin, buttonFrame.size.width, buttonFrame.size.height);
}
completion: ^(BOOL finished)
{
[UIView animateWithDuration: 0.5f animations:^
{
[buttonPanel setBackgroundImage: [UIImage imageNamed: imageName] forState: UIControlStateNormal];
[self setAlpha: 1.0f];
}];
}];

如果我删除setBackgroundImage:消息它只是正确地动画到新的帧位置。为什么?

谢谢。

好的,新答案!你的评论给了我所需要的线索。你说:

使按钮返回到初始帧是有原因的。基本上任何操作,比如从UIViewController调用模式UIViewController,都会将按钮设置为初始Fram位置

右。因为显示一个模态控制器然后忽略它会导致视图出现,并导致布局发生。您必须使用自动布局!自动布局会导致这种情况发生。因此,这里的问题是,当使用"自动布局"时,您不知道如何更改视图的位置/大小(在动画或任何其他时间)。

规则很简单<生活在约束之下的人死于约束>如果使用"自动布局",则不得更改任何内容的框架。必须通过更改约束来进行所有位置/大小调整。

奇妙的是,这通常比更改框架更容易、更简单!您不必获取帧、更改帧和指定帧;相反,您通常可以直接更改约束的constant

在这个例子中,我制作了UITextView收缩的动画,这样当键盘从屏幕底部(iPhone)升起时,整个UITextView都是可见的:

[UIView animateWithDuration:duration.floatValue
animations:
^{
self.bottomConstraint.constant = -r.size.height;
[self.view layoutIfNeeded];
} completion:nil];

这就是设置约束动画的方法:在更改constant时,还必须调用layoutIfNeeded以在动画的每个瞬间获得新布局。

所以,我并不是说你不使用自动布局是错误的。它是"选择加入";你可以在你想使用的时候开始使用,你可以在一些笔尖上使用它,而不是在其他笔尖上,等等。但它比旧的布局方式强大得多,而且在很多方面它会导致更简单的代码-一旦你知道如何使用它。

backgroundImage不是可设置动画的属性,为什么要在动画块中设置它?尝试在所有动画之前设置它。只是猜测,但值得一试。

编辑:我刚试过这个:

[UIView animateWithDuration:0.4 animations:^{
CGRect r = self.otherButton.frame;
r.origin.y += 100;
self.otherButton.frame = r;
[self.otherButton setBackgroundImage:[UIImage imageNamed:@"car.jpg"] 
forState:UIControlStateNormal];
}];

它运行良好。所以我无法重现你的问题。您的代码中是否有其他内容没有告诉我们?换句话说,试着把它简化为一个更简单的可行案例,然后重新构建它,这样你就会发现问题的症结所在。

OK,

我发现了这个疯狂的问题,我有一个UIViewController,使用自动布局检查,它把我所有的动画都搞砸了。即使您选中了UIViewController使用自动布局,它也会打乱所有控制器,可能是因为我不使用UINavigationController,而且分段是模态的。

这是。

最新更新