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];
}
感謝を!
私が質問を投稿しませずっと後に並行して、これを発見しました。私はむしろ馬鹿だと感じました。ありがとうございました! – clstroud
問題を拡張するだけです:1. '&&'は論理ANDです。つまり、 "両方とも真の場合"を意味します。条件は、 "このポインタが' nil'で、オブジェクトの長さが...であれば読み込みます。ポインタが 'nil'の場合、オブジェクトは存在しないので、長さを要求するのはナンセンスです。 2. '>!'はObjective-Cの演算子ではありません。コンパイラは空白を気にしないので、実際には有効ですが、2つの演算子としてトークン化されています。実際には、[長さ> 0であれば>]という明確な記述があります。 '!0'(論理0でない)は1なので、長さが1より大きいかどうかを比較しています。 –
@Peter Hosey:私はそれを知っていましたが、 – Jhaliya