如果该子视图具有动画层,则删除UICollectionView单元格内容视图的子视图会崩溃

时间:2016-06-25 11:52:49

标签: ios objective-c uicollectionview calayer cabasicanimation

我在一个图层上添加了CABasicAnimation,该图层作为子图层添加到自定义视图中。然后将自定义视图作为子视图添加到集合视图单元格内容视图中。我希望显示无限期的进度,例如栏从左向右移动直到下载完成(请参阅附件)。一切都很好,除了下载完成后,为了删除带有图层动画的自定义视图,我无法使用标签访问该视图。编译器崩溃并抛出无法加载任何Objective-C类信息。这将显着降低可用类型信息的质量'

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{

    NSMutableDictionary *attachDetail = [self getManagedObjectForIndexPath:indexPath];


    ZCRMMailAttachmentCollectionViewCell *cell = (ZCRMMailAttachmentCollectionViewCell*)[collectionView dequeueReusableCellWithReuseIdentifier:@"cellId" forIndexPath:indexPath];

    [self setVisibilityOfRemoveButtonInCell:cell inObj:attachDetail];
    [self setVisibilityOfSizeInCell:cell inObj:attachDetail];
    cell.attachDetails = attachDetail;

    [self addLoadingViewIfNotDownloaded:cell managedObject:attachDetail];

    [cell redraw];

    return cell;

}

-(void)addLoadingViewIfNotDownloaded:(ZCRMMailAttachmentCollectionViewCell*)cell managedObject:(NSDictionary*)attachDict
{
   NSNumber *progress = attachDict[MAIL_ATTACH_DOWNLOAD_PROGRESS];
   if(!ZV_IsEmpty(progress))
   {
      if (isinf([progress floatValue]))
      {
        [cell addLinearInfiniteProgress];
      }
      else
      {
        [cell removeLinearProgress];
       }
   } 
}

-(void)addLinearInfiniteProgress
{
    UIView* view = [zTvContentView viewWithTag:1234];

    if(!view)
    {
        UIView *progressView = [UIView new];
        progressView.tag = 1234;
        progressView.layer.masksToBounds = YES;


        [zTvContentView addSubview:progressView];
        [progressView setBottom:-1];
        [progressView alignTo:VTLayoutAlignLeft|VTLayoutAlignRight];
        [progressView setHeight:2];


            //ProgressLayer

            CGRect frame = self.contentView.bounds;

            CALayer * indeterminateLayer = [CALayer layer];
            indeterminateLayer.delegate = self;
            indeterminateLayer.name = @"progresslayer";
            indeterminateLayer.frame = CGRectMake(0, 0, 0.4*CGRectGetWidth(frame), 3);
            indeterminateLayer.backgroundColor = [CurTheme() themeActionItemColor].CGColor;
            indeterminateLayer.opacity = 1;
            [progressView.layer addSublayer:indeterminateLayer];

            CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
            animation.duration = 1;
            animation.repeatCount = HUGE_VALF;
            animation.removedOnCompletion = YES;
            animation.fromValue = [NSValue valueWithCGPoint:CGPointMake( CGRectGetMinX(frame) - indeterminateLayer.frame.size.width + OFFSET, 0)];
            animation.toValue = [NSValue valueWithCGPoint:CGPointMake(CGRectGetMaxX(frame) + indeterminateLayer.frame.size.width - OFFSET, 0)];


            [indeterminateLayer addAnimation:animation forKey:@"position"];

    }
}

(void)removeLinearInfiniteProgress
{
    UIView* progressView = [zTvContentView viewWithTag:1234];

    if(progressView)
    {
        if ([progressView superview])
        {
            [progressView removeFromSuperview];
        }
    }
}

任何帮助都将不胜感激。

enter image description here enter image description here

0 个答案:

没有答案