添加子图层后SuperView会变为空,但图像仍然可见

时间:2013-01-10 09:53:04

标签: ios uiimageview calayer cagradientlayer

我正在使用MKNetwrkKit。我有imageView,我已将其subView添加到UIView。我使用"UIImageView+MKNetworkKitAdditions.h"下载图像。我在ImageView添加了一个掩码,并在下载完成之前将其从superView中删除,然后我崩溃了!

- (void) testUIImageViewDownloadCrash {
    UIImageView *imageView = [[UIImageView alloc] init];

    [imageView mk_setImageAtURL:[NSURL URLWithString:@"http://www.gravatar.com/avatar/a717291747c76567bb0f086e15ae6e43?s=32&d=identicon&r=PG"] onCompletion:^(BOOL success, BOOL fromCache) {
        //
    }];

    UIView *view = [[UIView alloc] init];
    [view addSubview:imageView];
    [self addMaskToImageView:imageView];
    [imageView removeFromSuperview];
}

现在,奇怪的是,只有当我添加蒙版时才会发生此崩溃...这里是添加蒙版的函数。

- (CAGradientLayer*) addMaskToImageView:(UIImageView *) inImageView
{
    CALayer *imageLayer = inImageView.layer;
    CGRect imageBounds = imageLayer.bounds;
    CGRect ellipseRect = CGRectInset(imageBounds, 4, 4);

    CGPathRef maskPath = CGPathCreateWithEllipseInRect(ellipseRect, NULL);
    if (maskPath)
    {
        CAShapeLayer *maskLayer = [CAShapeLayer layer];
        maskLayer.bounds = imageBounds;
        maskLayer.position = (CGPoint){CGRectGetMidX(imageBounds), CGRectGetMidY(imageBounds)};
        maskLayer.path = maskPath;
        maskLayer.fillColor = [UIColor blackColor].CGColor;

        imageLayer.mask = maskLayer;
        CFRelease(maskPath);        
    }

    CAGradientLayer *gradientRingLayer = [self createGradientRing:imageBounds];

    CALayer *containerLayer = [CALayer layer];

    [imageLayer.superlayer addSublayer:containerLayer];
    // Move container layer to the image position
    containerLayer.position = imageLayer.position;
    // Image is now at 0,0 in the container
    imageLayer.position = CGPointZero;

    [containerLayer addSublayer:gradientRingLayer];
    [containerLayer addSublayer:imageLayer];
         layer.shouldRasterize = YES;
         layer.rasterizationScale = [[UIScreen mainScreen] scale];
         layer.contentsScale = [[UIScreen mainScreen] scale];


    containerLayer.shadowColor = [UIColor blackColor].CGColor;
    containerLayer.shadowOpacity = 1.0f;
    containerLayer.shadowOffset = CGSizeMake(2.0f, 5.0f);
    containerLayer.shadowRadius = 7.5f;
    // Create shadow at the righ place around the image
    CGPathRef containerShadowPath = CGPathCreateWithEllipseInRect(imageLayer.frame, NULL);
    containerLayer.shadowPath = containerShadowPath;
    CFRelease(containerShadowPath);

    return gradientRingLayer;
}

- (CAGradientLayer*)createGradientRing:(CGRect)inBounds {
        CAGradientLayer *gradient = [CAGradientLayer layer];
        gradient.anchorPoint = CGPointMake(0.5f, 0.5f);
        gradient.position = CGPointMake(0.0f, 0.0f);
        //    gradient.startPoint = CGPointMake(0.0,0.0);
        //    gradient.endPoint = CGPointMake(0.0,0.0);
        gradient.bounds = inBounds;
        gradient.cornerRadius = 0.0;
        gradient.colors = [NSArray arrayWithObjects:
                           (id)[UIColor ringLight].CGColor,
                           (id)[UIColor ringLight].CGColor,
                           nil];

        CAShapeLayer *frameLayer = [CAShapeLayer layer];
        CGPathRef framePath = CGPathCreateWithEllipseInRect(CGRectInset(inBounds, 0, 0), NULL);
        if (framePath)
        {
            frameLayer.bounds = inBounds;
            frameLayer.position = (CGPoint){CGRectGetMidX(inBounds), CGRectGetMidY(inBounds)};
            frameLayer.path = framePath;
            frameLayer.fillColor = [UIColor blackColor].CGColor;
            CFRelease(framePath);
        }

        gradient.mask = frameLayer;

        return gradient;
    }

如果我注释掉添加蒙版,它就不会崩溃。我不明白的另一件事是,在添加蒙版后,如果这样做:

NSLog(@"subviews count : %i",[view.subviews count]);
然后我得到0! imageView去了哪里?

我发现addMask函数正在使superViewimageView null。我发现行[containerLayer addSublayer:imageLayer];是罪魁祸首。这使得superView的{​​{1}}为空。但为什么?我该如何解决?

有时我也得到这个例外,我不知道为什么。

imageView

我在iOS 5和iOS 6上试过。

0 个答案:

没有答案