UIActivityIndicatorView 在 UITableViewCell 中停止动画
UIActivityIndicatorView stops animating in UITableViewCell
我有一个 table 视图,在那个 table 视图中我有一个 UIActivityIndicator,每个单元格都有一个按钮。现在点击那个按钮我想开始 ActivityIndicator 动画,它开始了。但问题是当我滚动 table 视图时它停止动画。这是我的 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];
}
当滚动顺序加载新的可见单元格时,您需要维护哪个单元格的 activity 指示器已作为 tableView 启动。结果,您的 activity 指标停止了。
为 activity 指标状态使用一个数组,这将 class 成员对象。
NSMutableArray *mutArrActIndStatus;
//Intialization
mutArrActIndStatus = [NSMutableArray array];
现在添加等于 tableView 数据源的对象。注 1 表示开始,0 表示停止。所以一开始都处于停止状态
for(int i=0; i<[yourTableViewArray count]; i++)
{
[mutArrActIndStatus addObject:@"0"];
}
现在在您的 tableView 中使用它:
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//...............
//................
UIActivityIndicatorView *activityIndicator = (UIActivityIndicatorView *) [cell viewWithTag:104];
button.tag = indexPath.row;
NSString *strActIndStatus = mutArrActIndStatus[indexPath.row];
if([strActIndStatus isEqualToString:@"1"])
{
[activityIndicator startAnimating];
}
return cell;
}
接下来更改按钮的方法以替换 activity 指标的状态
-(IBAction)recevierButtonClick:(id)sender{
//for find index here to replace status of activity indicator
UIButton *btnSender = (UIButton *)sender;
[mutArrActIndStatus replaceObjectAtIndex:btnSender.tag withObject:@"1"];
}
我想我可以阐明旋转器何时以及如何停止在细胞中旋转。
我用自己的 class 子 classed UIActivityIndicatorView
重载了 startAnimating
和 stopAnimating
函数,并在其中放置了断点。我制作了一个简单的单元格,上面只有一个微调器 class。我在 IB 中将微调器的 Animating 属性 设置为 true:
现在是这样的。前两个屏幕截图有一个堆栈跟踪,表明两个动作(停止动画和启动动画)在同一个私有函数中一个接一个地发生 _didMoveFromWindow:toWindow
:
在我看来,这是在单元格创建流程中发生的,所以首先它在没有动画的情况下进行初始化,然后 IB 设置启动并开始动画。现在这是有趣的部分,当微调器停止动画时:
似乎当单元格从屏幕上移开时微调器一直在旋转,当单元格准备好通过私有函数 prepareForReuse
再次显示在屏幕上时微调器停止旋转 _removeAllAnimations
,它似乎递归地迭代所有子视图。
问题是出于某种原因,UIKit 的私有函数永远不会重新启用动画,并且 startAnimating
永远不会被调用。实际上,IMO 禁用动画才是真正的问题。
我提出的解决方案并不完美,但显然是 Apple 对我们的期望,它是 class 将 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
我有一个 table 视图,在那个 table 视图中我有一个 UIActivityIndicator,每个单元格都有一个按钮。现在点击那个按钮我想开始 ActivityIndicator 动画,它开始了。但问题是当我滚动 table 视图时它停止动画。这是我的 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];
}
当滚动顺序加载新的可见单元格时,您需要维护哪个单元格的 activity 指示器已作为 tableView 启动。结果,您的 activity 指标停止了。
为 activity 指标状态使用一个数组,这将 class 成员对象。
NSMutableArray *mutArrActIndStatus;
//Intialization
mutArrActIndStatus = [NSMutableArray array];
现在添加等于 tableView 数据源的对象。注 1 表示开始,0 表示停止。所以一开始都处于停止状态
for(int i=0; i<[yourTableViewArray count]; i++)
{
[mutArrActIndStatus addObject:@"0"];
}
现在在您的 tableView 中使用它:
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//...............
//................
UIActivityIndicatorView *activityIndicator = (UIActivityIndicatorView *) [cell viewWithTag:104];
button.tag = indexPath.row;
NSString *strActIndStatus = mutArrActIndStatus[indexPath.row];
if([strActIndStatus isEqualToString:@"1"])
{
[activityIndicator startAnimating];
}
return cell;
}
接下来更改按钮的方法以替换 activity 指标的状态
-(IBAction)recevierButtonClick:(id)sender{
//for find index here to replace status of activity indicator
UIButton *btnSender = (UIButton *)sender;
[mutArrActIndStatus replaceObjectAtIndex:btnSender.tag withObject:@"1"];
}
我想我可以阐明旋转器何时以及如何停止在细胞中旋转。
我用自己的 class 子 classed UIActivityIndicatorView
重载了 startAnimating
和 stopAnimating
函数,并在其中放置了断点。我制作了一个简单的单元格,上面只有一个微调器 class。我在 IB 中将微调器的 Animating 属性 设置为 true:
现在是这样的。前两个屏幕截图有一个堆栈跟踪,表明两个动作(停止动画和启动动画)在同一个私有函数中一个接一个地发生 _didMoveFromWindow:toWindow
:
在我看来,这是在单元格创建流程中发生的,所以首先它在没有动画的情况下进行初始化,然后 IB 设置启动并开始动画。现在这是有趣的部分,当微调器停止动画时:
似乎当单元格从屏幕上移开时微调器一直在旋转,当单元格准备好通过私有函数 prepareForReuse
再次显示在屏幕上时微调器停止旋转 _removeAllAnimations
,它似乎递归地迭代所有子视图。
问题是出于某种原因,UIKit 的私有函数永远不会重新启用动画,并且 startAnimating
永远不会被调用。实际上,IMO 禁用动画才是真正的问题。
我提出的解决方案并不完美,但显然是 Apple 对我们的期望,它是 class 将 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