在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
时的大小不同。如何解决此问题?
发布于 2013-10-22 20:54:16
如何创建新标签并使用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];
发布于 2013-10-21 17:15:53
也许您需要为this答案中建议的方法提供额外的选项:
CGSize maximumLabelSize = CGSizeMake(310, CGFLOAT_MAX);
CGRect textRect = [myString boundingRectWithSize:maximumLabelSize
options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
attributes:@{NSFontAttributeName: fontText}
context:nil];
发布于 2014-07-08 00:12:29
以下是我的工作代码片段:
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,您可以使用my方法:
- (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中收到警告,因此我添加了诊断杂注代码来删除此特定函数的警告-调用/代码块。
- (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主题:根据您使用的字体和字体粗细,计算返回不同的高度值。在我的例子中: HelveticaNeue-Medium的fontsize为16.0,返回的行高为20.0,但是对于两行返回39.0,对于4行返回78px --从第2行开始,每行都缺少1px --但是你想让你的fontsize + 4px的每一行都有一个高度结果。
请在编码时牢记这一点!
我还没有一个函数来解决这个“问题”,但我会在完成后更新这篇文章。
https://stackoverflow.com/questions/19398674
复制相似问题