Подкласс UILabel иногда падает на drawRect: - PullRequest
0 голосов
/ 19 июня 2011

так что у меня есть подкласс UILabel, который очень часто вылетает при первой загрузке. Метка находится в моем корневом контроллере представления, так что это один из первых загруженных объектов. Проблема в том, что он продолжает падать на линии в drawRect, о которой я расскажу ниже.

Я попытался убедиться, что текст не равен нулю, и если это так, пропустил на чертеже, потому что sizeWithFont: продолжает выдавать мне ошибки NaN, которые приводят к сбоям во время выполнения.

Если вы более опытны с CoreGraphics, пожалуйста, протяните мне руку и скажите, почему этот конкретный фрагмент нестабилен:

- (void)drawRect:(CGRect)rect {
if(self.text == nil && self.text.length >! 0){
    return;
}
UIFont *font = self.font;
CGSize fontSize = [self.text sizeWithFont:font];
if(isnan(fontSize.width) == YES)return;
if(isnan(fontSize.height) == YES)return;
CGImageRef mask = [self createMaskWithSize:rect.size shape:^{
    [[UIColor blackColor] setFill];
    CGContextFillRect(UIGraphicsGetCurrentContext(), rect);
    [[UIColor whiteColor] setFill];
    // custom shape goes here
    if(self.textAlignment == UITextAlignmentLeft){
        [self.text drawAtPoint:CGPointMake(0, 0) withFont:font];
        [self.text drawAtPoint:CGPointMake(0, -1) withFont:font];
    }else{
        [self.text drawAtPoint:CGPointMake((self.bounds.size.width/2)-(fontSize.width/2), 0) withFont:font];
        [self.text drawAtPoint:CGPointMake((self.bounds.size.width/2)-(fontSize.width/2), -1) withFont:font];
    }
}];

CGImageRef cutoutRef = CGImageCreateWithMask([self blackSquareOfSize:rect.size].CGImage, mask);

UIImage *cutout = [UIImage imageWithCGImage:cutoutRef scale:[[UIScreen mainScreen] scale] orientation:UIImageOrientationUp]; 
    ^^ THIS IS WHAT CRASHES *******

CGImageRelease(cutoutRef);  

CGImageRef shadedMask = [self createMaskWithSize:rect.size shape:^{
    [[UIColor whiteColor] setFill];
    CGContextFillRect(UIGraphicsGetCurrentContext(), rect);
    CGContextSetShadowWithColor(UIGraphicsGetCurrentContext(), CGSizeMake(0, .5), 2.5f, [[UIColor colorWithWhite:0.0 alpha:0.8] CGColor]);
    [cutout drawAtPoint:CGPointZero];
}];

// create negative image
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
[[UIColor blackColor] setFill];
// custom shape goes here
if(self.textAlignment == UITextAlignmentLeft)[self.text drawAtPoint:CGPointMake(0, -1) withFont:font];
else [self.text drawAtPoint:CGPointMake((self.bounds.size.width/2)-(fontSize.width/2), -1) withFont:font];
UIImage *negative = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext(); 

CGImageRef innerShadowRef = CGImageCreateWithMask(negative.CGImage, shadedMask);
//CGImageRelease(shadedMask);
//UIImage *innerShadow = [UIImage imageWithCGImage:innerShadowRef scale:[[UIScreen mainScreen] scale] orientation:UIImageOrientationUp];
CGImageRelease(innerShadowRef);

//Draw Bevel
[[UIColor whiteColor] setFill];
if(self.textAlignment == UITextAlignmentLeft)[self.text drawAtPoint:CGPointMake(0, 0.0) withFont:font];
else [self.text drawAtPoint:CGPointMake((self.bounds.size.width/2)-(fontSize.width/2), 0.0) withFont:font];

// draw actual image
[self.textColor setFill];
if(self.textAlignment == UITextAlignmentLeft)[self.text drawAtPoint:CGPointMake(0, -0.5) withFont:font];
else [self.text drawAtPoint:CGPointMake((self.bounds.size.width/2)-(fontSize.width/2), -0.5) withFont:font];
// finally apply shadow
//[innerShadow drawAtPoint:CGPointZero];

}

Спасибо!

1 Ответ

2 голосов
/ 19 июня 2011

Ваше состояние для тестирования self.text мне кажется неправильным,

Тест с приведенным ниже кодом ...

 - (void)drawRect:(CGRect)rect {
    if(self.text == nil ){
        return;
    }
    else if([self.text length] == 0){
    return;
    }
    .............
    .............
    }//Close of drawRect:
...