【问题标题】:UIActivityIndicator inside custom UICollectionViewCell - only displays/animate in first cell自定义 UICollectionViewCell 中的 UIActivityIndi​​cator - 仅在第一个单元格中显示/动画
【发布时间】:2013-10-26 23:46:14
【问题描述】:

在用户按下我的收藏单元格中的按钮后,我正在为 ActivityIndi​​cator 设置动画,同时等待网络响应。下面的代码由自定义单元格的每个实例调用(在调试器中确认),但活动指示器仅在单击第一个单元格中的按钮时显示,或者在重复使用第一个单元格的单元格中单击时显示。如果我在第一个单元格之前单击另一个单元格中的按钮并不重要。

customCollectionViewCell.m
@interface customCollectionViewCell(){
    UIActivityIndicatorView *activityIndicator;
}

@implementation cutomCollectionViewCell
 - (void) choiceClicked:(id)sender{

   dispatch_async(dispatch_get_main_queue(), ^{
        activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
        actvityIndicator.center = self.center;
        [self.contentView addSubview:activityIndicator];
        [actvityIndicator startAnimating];
    });
    async - network stuff
}

我确保在准备重用时,我将从超级视图中删除指示器并将其设置为 nil。

我还尝试仅在指示器不存在时创建指示器并开始动画 - 行为仍然没有变化。
编辑:如果只是从主线程调用动画并且其他调用是默认队列的明确一部分,也没有关系。

if (activityIndicator == nil){
    activityIndicator = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
    activityIndicator.center = self.center;
    [self.contentView addSubview:activityIndicator];
}
dispatch_async(dispatch_get_main_queue(), ^{
    [activityIndicator startAnimating];
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    network call
        });

【问题讨论】:

  • 您的网络调用是否仍然被调用,或者它是否立即返回或其他单元格?你什么时候停止活动指示器的动画?为什么不一直显示指标并使用hidesWhenStopped
  • 另外,在调试器中,注销一些框架和子视图等等。如果代码正在执行,则该指标将在某处
  • 退出框架和子视图表明 self.center 返回一个 CGPoint,其 Y 值 = 滚动视图中的位置,而不是单元格高度/宽度的中心。这使得活动指示器在所有单元格中工作:activityIndicator.center = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);

标签: ios uicollectionview uiactivityindicatorview uicollectionviewcell


【解决方案1】:

自定义单元格内的 Self.center 返回一个 CGPoint,其 Y 值 = 滚动视图中的位置,而不是单元格高度的中心,这将活动视图放置在单元格的可见框架之外。

这使得活动指示器在所有单元格中工作: activityIndicator.center = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);

【讨论】:

  • self.contentView.center 也可以。 center 总是返回父视图坐标空间中的坐标。
  • 真的很有帮助,+1 在我的情况下,只需将细胞中心传递到活动指标中心。@minerat
猜你喜欢
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多