UIActivityIndi​​catorView 在 UICollectionViewCell 中不旋转

Rob*_*egg 5 iphone uiactivityindicatorview ios uicollectionview

我有一个自定义单元格加载在我的集合视图的底部。它唯一的工作是显示活动指示器视图 - 这在应用程序进行新的工作调用时发生。

所以我将它添加到单元格中,如下所示:

BBLoaderCell *loaderCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"LoaderCell" forIndexPath:indexPath];


UIActivityIndicatorView * activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
activityIndicator.hidesWhenStopped = YES;
activityIndicator.hidden = NO;
activityIndicator.center = loaderCell.imageView.center;
activityIndicator.tag = 10;

[loaderCell.imageView addSubview:activityIndicator];

    [activityIndicator startAnimating];
    return loaderCell;
Run Code Online (Sandbox Code Playgroud)

这在我视图的最后一个单元格中显示了一个活动指示器 - 但它不旋转。有任何想法吗?

找到解决方案

根据评论 - 这是一个线程问题。我还采纳了将代码移动到单元格的自定义 nib 文件中的建议。

这是重构的代码:

BBLoaderCell *loaderCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"LoaderCell" forIndexPath:indexPath];
    loaderCell.backgroundColor = [UIColor clearColor];

     if (self.loadingMore == NO){
        dispatch_async(dispatch_get_main_queue(), ^{
            activityIndicator.hidden = YES;
            [loaderCell.spinner stopAnimating];
        });
    }
     else if (self.loadingMore == YES){
    dispatch_async(dispatch_get_main_queue(), ^{
        activityIndicator.hidden = NO;
        [loaderCell.spinner startAnimating];
    });
    }

    return loaderCell;
Run Code Online (Sandbox Code Playgroud)

这正在按我需要的方式工作。

多谢你们!

Hle*_*ess 2

我认为这可能与线程有关(例如,主线程上的 UI 尚未准备好为指示器设置动画)。您可以尝试如下操作:

[activityIndicator performSelector:@selector(startAnimating:) withObject:nil afterDelay:1];

但这只是一个可能的建议,您应该尝试不同的变体,并检查哪一个变体将动画正确且及时地强制到主线程上。另一种变化:

dispatch_async(dispatch_get_main_queue(), ^{
    [activityIndicator startAnimating];
});
Run Code Online (Sandbox Code Playgroud)