在iOS7中,sizeWithFont
已弃用,因此我使用boundingRectWithSize
(返回CGRect值)。我的代码:
UIFont *fontText = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16];
// you can use your font.
CGSize maximumLabelSize = CGSizeMake(310, 9999);
CGRect textRect = [myString boundingRectWithSize:maximumLabelSize
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:fontText}
context:nil];
expectedLabelSize = CGSizeMake(textRect.size.width, textRect.size.height);
在textRect
中,我的尺寸大于maximumLabelSize
,尺寸与使用sizeWithFont
时不同。我该如何解决这个问题?
答案 0 :(得分:147)
如何创建新标签并使用sizeThatFit:(CGSize)size
??
UILabel *gettingSizeLabel = [[UILabel alloc] init];
gettingSizeLabel.font = [UIFont fontWithName:@"YOUR FONT's NAME" size:16];
gettingSizeLabel.text = @"YOUR LABEL's TEXT";
gettingSizeLabel.numberOfLines = 0;
gettingSizeLabel.lineBreakMode = NSLineBreakByWordWrapping;
CGSize maximumLabelSize = CGSizeMake(310, CGFLOAT_MAX);
CGSize expectSize = [gettingSizeLabel sizeThatFits:maximumLabelSize];
编辑:此高级代码不适用于ios 7及更高版本,因此请使用以下内容:
CGRect textRect = [myString boundingRectWithSize:maximumLabelSize
options:NSStringDrawingUsesLineFragmentOrigin| NSStringDrawingUsesFontLeading
attributes:@{NSFontAttributeName:fontText}
context:nil];
答案 1 :(得分:35)
也许您需要为this answer:
中建议的方法提供其他选项CGSize maximumLabelSize = CGSizeMake(310, CGFLOAT_MAX);
CGRect textRect = [myString boundingRectWithSize:maximumLabelSize
options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
attributes:@{NSFontAttributeName: fontText}
context:nil];
答案 2 :(得分:15)
这是我的工作代码段:
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:attributeDict];
NSString *headline = [dict objectForKey:@"title"];
UIFont *font = [UIFont boldSystemFontOfSize:18];
CGRect rect = [headline boundingRectWithSize:CGSizeMake(300, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
CGFloat height = roundf(rect.size.height +4)
我将4px添加到计算出的高度,因为如果没有这些4px,则会丢失一行。
我在tableView中使用此代码片段并将“height”添加到NSNumbers数组中,并获得默认textLabel的正确单元格高度。
如果您希望textLabel中的文本下方有更多空间,请再添加4个像素。
****更新****
我不同意“40px的宽度错误”,我大概是4px的缺失高度,因为4px是字母和单行界限之间的空格的默认高度。 您可以使用UILabel进行检查,对于16的字体大小,您需要UILabel高度为20。
但是如果你的最后一行没有“g”或其他任何东西,测量可能会错过4px的高度。
我用一点方法重新检查它,我得到20,40或60的准确高度 我的标签和正确的宽度小于300px。
要支持iOS6和iOS7,您可以使用我的方法:
- (CGFloat)heightFromString:(NSString*)text withFont:(UIFont*)font constraintToWidth:(CGFloat)width
{
CGRect rect;
float iosVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (iosVersion >= 7.0) {
rect = [text boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
}
else {
CGSize size = [text sizeWithFont:font constrainedToSize:CGSizeMake(width, 1000) lineBreakMode:NSLineBreakByWordWrapping];
rect = CGRectMake(0, 0, size.width, size.height);
}
NSLog(@"%@: W: %.f, H: %.f", self, rect.size.width, rect.size.height);
return rect.size.height;
}
****升级****
感谢您的评论,我按照以下方式升级了我的功能。由于不推荐使用sizeWithFont,并且您将在XCode中收到警告,我添加了diagnostic-pragma-code以删除此特定函数调用/代码块的警告。
- (CGFloat)heightFromStringWithFont:(UIFont*)font constraintToWidth:(CGFloat)width
{
CGRect rect;
if ([self respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) {
rect = [self boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
}
else {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
CGSize size = [self sizeWithFont:font constrainedToSize:CGSizeMake(width, 1000) lineBreakMode:NSLineBreakByWordWrapping];
rect = CGRectMake(0, 0, size.width, size.height);
#pragma GCC diagnostic pop
}
return ceil(rect.size.height);
}
除4px主题外:
根据您使用的字体和字体权重,计算返回不同的高度值。在我的情况下:字体大小为16.0的HelveticaNeue-Medium返回单行的行高20.0,但两行为39.0,4行为78px - >每行丢失1px - 从第2行开始 - 但是您希望为获得高度结果的每一行都设置fontsize + 4px行间距。
编码时请记住这一点!
我还没有针对这个“问题”的功能,但我会在完成后更新这篇文章。
答案 3 :(得分:2)
如果我理解正确,你正在使用boundingRectWithSize:只是为了获得sizeWithFont的大小(意味着你想要直接使用CGSize,而不是CGRect)?
这看起来像你在寻找:
Replacement for deprecated sizeWithFont: in iOS 7?
他们使用sizeWithAttributes:获取大小,作为sizeWithFont的替代。
你是否仍然使用类似的东西得到错误的尺寸:
UIFont *fontText = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16];
// you can use your font.
expectedLabelSize = [myString sizeWithAttributes:@{NSFontAttributeName:fontText}];
答案 4 :(得分:2)
@ SoftDesigner的评论对我有用
CGRect descriptionRect = [description boundingRectWithSize:CGSizeMake(width, 0)
options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:12]}
context:nil];
result = ceil(descriptionRect.size.height);
答案 5 :(得分:1)
用于查找标签运行时间的大小 sizewithfont 已弃用iOS 7.0,而不是必须使用 -boundingRectWithSize:options:attributes:context:方法
您可以像下面的代码一样使用它
CGSize constraint = CGSizeMake(MAXIMUM_WIDHT, TEMP_HEIGHT);
NSRange range = NSMakeRange(0, [[self.message body] length]);
NSDictionary *attributes = [YOUR_LABEL.attributedText attributesAtIndex:0 effectiveRange:&range];
CGSize boundingBox = [myString boundingRectWithSize:constraint options:NSStringDrawingUsesFontLeading attributes:attributes context:nil].size;
int numberOfLine = ceil((boundingBox.width) / YOUR_LABEL.frame.size.width);
CGSize descSize = CGSizeMake(ceil(boundingBox.width), ceil(self.lblMessageDetail.frame.size.height*numberOfLine));
CGRect frame=YOUR_LABEL.frame;
frame.size.height=descSize.height;
YOUR_LABEL.frame=frame;
这里你必须给出最大长度的宽度以找到高度或宽度。
试试这对我有用。