1

MKNetwrkKit を使用しています。があります。imageViewとして に追加しましsubViewUIView。を使用して画像をダウンロードします"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;
    }

マスクの追加をコメントアウトすると、クラッシュしません。私が理解していないもう1つのことは、マスクを追加した後、これを行う場合です:

NSLog(@"subviews count : %i",[view.subviews count]);

それから私は0を取得します!どこに行ったimageView

addMask関数がヌルを作成していることsuperViewに気付きました。imageView行が原因であることがわかりました[containerLayer addSublayer:imageLayer];。これはヌルを作ってsuperViewいます。imageViewしかし、なぜ?どうすれば修正できますか?

時々私もこの例外を受け取りますが、その理由はわかりません。

-[__NSCFString sublayers]: unrecognized selector sent to instance

iOS 5 と iOS 6 で試しました。

4

0 に答える 0