取一段字符串的size的时候,宽度有可能返回nan(not a number)。因为需要对该方法进行Hook或者category。自身项目中采用的是category。
@interface NSString (SafeFontSize)
- (CGSize)safeSizeWithFont:(UIFont *)font;
- (CGSize)safeSizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size;
- (CGSize)safeSizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(NSLineBreakMode)lineBreakMode;
- (CGSize)safeSizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode;
- (CGSize)safeSizeWithFont:(UIFont *)font minFontSize:(CGFloat)minFontSize actualFontSize:(CGFloat *)actualFontSize forWidth:(CGFloat)width lineBreakMode:(NSLineBreakMode)lineBreakMode;
@end
@implementation NSString (SafeFontSize)
- (CGSize)safeSizeWithFont:(UIFont *)font;
{
CGSize inSize = [self sizeWithFont:font];
if (! isnormal(inSize.width)) {
inSize.width = 0;
}
return inSize;
}
- (CGSize)safeSizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
{
CGSize inSize = [self sizeWithFont:font constrainedToSize:size];
if (! isnormal(inSize.width)) {
inSize.width = 0;
}
return inSize;
}
- (CGSize)safeSizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(NSLineBreakMode)lineBreakMode
{
CGSize inSize = [self sizeWithFont:font forWidth:width lineBreakMode:lineBreakMode];
if (! isnormal(inSize.width)) {
inSize.width = 0;
}
return inSize;
}
- (CGSize)safeSizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode
{
CGSize inSize = [self sizeWithFont:font constrainedToSize:size lineBreakMode:lineBreakMode];
if (! isnormal(inSize.width)) {
inSize.width = 0;
}
return inSize;
}
- (CGSize)safeSizeWithFont:(UIFont *)font minFontSize:(CGFloat)minFontSize actualFontSize:(CGFloat *)actualFontSize forWidth:(CGFloat)width lineBreakMode:(NSLineBreakMode)lineBreakMode
{
CGSize inSize = [self sizeWithFont:font minFontSize:minFontSize actualFontSize:actualFontSize forWidth:width lineBreakMode:lineBreakMode];
if (! isnormal(inSize.width)) {
inSize.width = 0;
}
return inSize;
}
@end