gpt4 book ai didi

ios - UIActivityIndi​​catorView 在 UITableViewCell 中停止动画

转载 作者:IT王子 更新时间:2023-10-29 07:56:44 25 4
gpt4 key购买 nike

我有一个表格 View ,在那个表格 View 中我有一个 UIActivityIndi​​cator,每个单元格都有一个按钮。现在点击那个按钮我想开始 ActivityIndi​​cator 动画,它开始了。但问题是当我滚动表格 View 时它停止动画。这是我的 cellForRowAtIndexPath 代码

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"txDevicesListCellID"];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"txDevicesListCellID"];
}
UIButton *buttonutton = (UIButton *)[cell viewWithTag:103];
UIActivityIndicatorView *activityIndicator = (UIActivityIndicatorView *) [cell viewWithTag:104];
button.tag = indexPath.row;
return cell;
}

我的按钮选择器方法是

-(IBAction)recevierButtonClick:(id)sender{
UIButton *button = (UIButton *)sender;
NSInteger index = button.tag;
NSIndexPath* indexpath = [NSIndexPath indexPathForRow:serialNumber inSection:0];
UITableViewCell* cell = [self.myTableView cellForRowAtIndexPath:indexpath];
activityIndicator = (UIActivityIndicatorView*)[cell viewWithTag:index];
[activityIndicator startAnimating];
}

最佳答案

我想我可以阐明旋转器何时以及如何停止在细胞中旋转。我用我自己的类对 UIActivityIndi​​catorView 进行了子类化,重载了 startAnimatingstopAnimating 函数,并在其中放置了断点。我制作了一个简单的单元格,上面只有一个微调器。我在 IB 中将微调器的 Animating 属性设置为 true: enter image description here

现在是这样的。前两个屏幕截图有一个堆栈跟踪,表明两个 Action (停止动画和启动动画)在同一个私有(private)函数 _didMoveFromWindow:toWindow 中一个接一个地发生: enter image description here enter image description here

在我看来,这是在单元格创建流程中发生的,所以首先它在没有动画的情况下进行初始化,然后 IB 设置启动并开始动画。现在这是有趣的部分,当微调器停止动画时: enter image description here

因此,当单元格从屏幕上移除时微调器似乎一直在旋转,当单元格准备好通过私有(private)函数 _removeAllAnimations 再次显示在屏幕上时停止旋转(prepareForReuse) ,它似乎递归地迭代所有 subview 。问题是出于某种原因,UIKit 的私有(private)函数永远不会重新启用动画,并且 startAnimating 永远不会被调用。实际上,IMO 禁用动画才是真正的问题。

我提出的解决方案并不完美,但显然是 Apple 对我们的期望,它是将 UITableViewCell 子类化为包含微调器的单元格,并在 prepareForReuse 中重新启用它们:

class SpinnerCell: UITableViewCell {
@IBOutlet weak var spinner: UIActivityIndicatorView?

override func prepareForReuse() {
super.prepareForReuse()
if let spinner = self.spinner {
spinner.startAnimating()
}
}
}

或者在 Obj-C 中:

@interface SpinnerCell

@property (weak) IBOutlet UIActivityIndicatorView *spinner;

@end

@implementation SpinnerCell

- (void)prepareForReuse {
[super prepareForReuse];
[self.spinner startAnimating];
}

@end

关于ios - UIActivityIndi​​catorView 在 UITableViewCell 中停止动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28737772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com