设置 UIButton 背景图像停止动画

Posted

技术标签:

【中文标题】设置 UIButton 背景图像停止动画【英文标题】:Setting UIButton background image stops animation 【发布时间】:2012-11-25 16:52:58 【问题描述】:

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

    [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: 消息,它只会正确地动画到新的帧位置。为什么?

谢谢。

【问题讨论】:

您的代码中有两个 setBackgroundImage: 消息。哪一个在谈论删除? 选择,没关系,抱歉这是我做的测试...忘记删除了。 【参考方案1】:

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

出于某种原因使按钮返回初始帧。基本上任何操作,例如从此 UIViewController 调用模态 UIViewController 将按钮设置为初始 Fram 位置

没错。因为显示模态控制器然后关闭它会导致您的视图出现,并导致布局发生。您必须使用自动布局!自动布局会导致这种情况发生。所以这里的问题是你不明白在使用自动布局时如何改变视图的位置/大小(在动画或任何其他时间)。

规则很简单。 为约束而生的人,为约束而死。如果你使用Auto Layout,你不能改变任何东西的框架。您必须通过更改约束来进行所有位置/大小调整。

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

在此示例中,我为 UITextView 的收缩设置动画,以便当键盘从屏幕底部(iPhone)升起时,整个 UITextView 将可见:

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

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

所以,我并不是说您不使用自动布局是错误的。它是“选择加入”;您可以在需要时开始使用,您可以在某些笔尖中使用它,而不是在其他笔尖中使用,等等。但它比旧的布局方式更加强大,并且在许多方面它领先到更简单的代码 - 一旦你知道如何使用它。

【讨论】:

完美答案!为什么不同意? 这个答案救了我的命【参考方案2】:

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];
];

效果很好。所以我无法重现您的问题。您的代码中是否还有其他事情您没有告诉我们?换句话说,尝试将其简化为一个更简单的有效案例,然后重新构建它,这样您就会发现问题所在。

【讨论】:

好的,我试试看,我的代码有点复杂,我只是添加了这段代码。 Self 是一个 UIView 自定义类,buttonPanel 是来自 UIViewController 的 UIButton 引用,它正在实例化这个自定义 UIView 类,而 UIView 类负责动画这个按钮并显示自己。在我添加此代码之前,一切都按预期工作,这应该不会造成问题! 哦,图像确实在正确更改....按钮动画没有发生。 @Taskos:但尝试在动画块中设置背景图像是没有意义的 - 它不是动画的。在动画之前或动画结束时执行。如果您希望图像出现或消失,请在动画之前设置它并为其 alpha 属性设置动画。 试过了,效果一样。使按钮返回初始帧是有原因的。基本上任何操作,例如从此 UIViewController 调用模态 UIViewController 将按钮设置为初始 Fram 位置。真是糟透了。【参考方案3】:

好的,

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

这是。

【讨论】:

以上是关于设置 UIButton 背景图像停止动画的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 3 为 iOS 中的 UIButton 设置“背景颜色”动画

UIButton:设置图像视图的背景(不设置图像)

使用 PNG 背景为 UIButton alpha 设置动画:为啥动画从 alpha = 0 过渡到 alpha = 1 时会变成亮白色?

UIButton:为选中的高亮 UI 状态设置背景颜色(不是图像)

为uibutton背景图像iphone sdk设置渐变颜色(颜色)

iOS UIButton在将背景图像设置为nil后消失