2011-06-19 11 views
0

にクラッシュすることがあるので、最初のロード時に頻繁にクラッシュするUILabelサブクラスがあります。ラベルはルートビューコントローラにあるので、最初に読み込まれたオブジェクトの1つです。問題は、drawRectの行にクラッシュすることです。これについては後述します。UILabelのサブクラスがdrawRect:

sizeWithFont:実行時にクラッシュするクラッシュにつながるNaNエラーを与え続けるので、テキストがnilではないことを確認しました。

あなたは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]; 

}

感謝を!

答えて

2

テストself.textのためのあなたの条件は私が間違っているようで、以下のコードで

テスト...

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

私が質問を投稿しませずっと後に並行して、これを発見しました。私はむしろ馬鹿だと感じました。ありがとうございました! – clstroud

+4

問題を拡張するだけです:1. '&&'は論理ANDです。つまり、 "両方とも真の場合"を意味します。条件は、 "このポインタが' nil'で、オブジェクトの長さが...であれば読み込みます。ポインタが 'nil'の場合、オブジェクトは存在しないので、長さを要求するのはナンセンスです。 2. '>!'はObjective-Cの演算子ではありません。コンパイラは空白を気にしないので、実際には有効ですが、2つの演算子としてトークン化されています。実際には、[長さ> 0であれば>]という明確な記述があります。 '!0'(論理0でない)は1なので、長さが1より大きいかどうかを比較しています。 –

+0

@Peter Hosey:私はそれを知っていましたが、 – Jhaliya

関連する問題