animateWithDuration 无法在 UIButton 设置图像后为 UIButton 的边界设置动画
animateWithDuration can't animating UIButton's bounds after UIButton has set an image
在我将图像设置为名为 bigIcon
的 UIButton
之后,我将其放入 animateWithDuration
并更改其框架,然后我 运行 代码,按钮大小立即改变(没有动画),但它从起点到终点缓慢移动(有动画),我该如何解决这个问题?我发现如果我确实为按钮设置了图像,这个问题就会消失。
代码如下:
- (void)bigImage:(MCGodCell *)godCell withImage:(UIImage *)image {
self.bigIcon = [UIButton new];
self.bigIcon.adjustsImageWhenHighlighted = NO;
[self.bigIcon setBackgroundImage:image forState:UIControlStateNormal];
CGFloat iconX = self.tableView.frame.size.width / 2.0;
CGFloat iconY = self.tableView.frame.size.height / 2.0;
self.bigIcon.frame = CGRectMake(iconX, iconY, 1, 1);
[self.tableView addSubview:self.bigIcon];
CGFloat iconW = self.tableView.frame.size.width;
CGFloat iconH = iconW;
iconY = (self.view.frame.size.height - iconH) / 2.0;
[UIView animateWithDuration:0.3 animations:^{
self.bigIcon.frame = CGRectMake(0, iconY, iconW, iconH);
}];
}
您没有看到框架发生变化,因为您试图在将它添加到视图层次结构后立即对其进行动画处理。
UIKit 需要将按钮添加为子视图,然后 运行 在下一个 UI 更新过程中添加动画。
像这样将动画块包裹在 dispatch_async
块中:
dispatch_async(dispatch_get_main_queue(), ^{
[UIView animateWithDuration:0.3 animations:^{
self.bigIcon.frame = CGRectMake(0, iconY, iconW, iconH);
}];
});
在我将图像设置为名为 bigIcon
的 UIButton
之后,我将其放入 animateWithDuration
并更改其框架,然后我 运行 代码,按钮大小立即改变(没有动画),但它从起点到终点缓慢移动(有动画),我该如何解决这个问题?我发现如果我确实为按钮设置了图像,这个问题就会消失。
代码如下:
- (void)bigImage:(MCGodCell *)godCell withImage:(UIImage *)image {
self.bigIcon = [UIButton new];
self.bigIcon.adjustsImageWhenHighlighted = NO;
[self.bigIcon setBackgroundImage:image forState:UIControlStateNormal];
CGFloat iconX = self.tableView.frame.size.width / 2.0;
CGFloat iconY = self.tableView.frame.size.height / 2.0;
self.bigIcon.frame = CGRectMake(iconX, iconY, 1, 1);
[self.tableView addSubview:self.bigIcon];
CGFloat iconW = self.tableView.frame.size.width;
CGFloat iconH = iconW;
iconY = (self.view.frame.size.height - iconH) / 2.0;
[UIView animateWithDuration:0.3 animations:^{
self.bigIcon.frame = CGRectMake(0, iconY, iconW, iconH);
}];
}
您没有看到框架发生变化,因为您试图在将它添加到视图层次结构后立即对其进行动画处理。
UIKit 需要将按钮添加为子视图,然后 运行 在下一个 UI 更新过程中添加动画。
像这样将动画块包裹在 dispatch_async
块中:
dispatch_async(dispatch_get_main_queue(), ^{
[UIView animateWithDuration:0.3 animations:^{
self.bigIcon.frame = CGRectMake(0, iconY, iconW, iconH);
}];
});