计算UILabel文本大小 [英] Calculating UILabel Text Size
问题描述
我正在以编程方式绘制 UILabels
。他们从数据库中获取大小。所以我不能只使用 sizeToFit
。我已经实现了一个以递增的比率重绘 UILabels
的函数。所以我需要找到的是我的视图中的 UILabel
中的文本,需要最大比例来重绘 UILabels
。
所以最后我需要做这样的事情:
I am drawing UILabels
programmatically. They get their sizes from a database. So I cannot just use sizeToFit
. I have already implemented a function that redraws UILabels
with a passed ratio. So all I need to find is the text in UILabel
from my view that would require the maximum ratio to redraw UILabels
.
So finally I need to do something like this:
double ratio = 1.00;
for (UILabel* labels in sec.subviews) {
float widthLabel = labels.frame.size.width;
float heightLabel = labels.frame.size.height;
float heightText = //get the text height here
float widthText = //get the text width here
if (widthLabel < widthText) {
ratio = MAX(widthText/widthLabel,ratio);
}
if (heightLabel < heightText) {
ratio = MAX(heightText/heightLabel, ratio);
}
}
//redraw UILabels with the given ratio here
<那么我怎样才能得到文本的高度和宽度大小,因为我的一些文字不适合标签我不能简单地使用标签边界?我正在使用Xcode 5和iOS 7.
So how can I get the height and width size of a text, as some of my text do not fit into the label I cannot simply use label bounds? I am using Xcode 5 and iOS 7.
推荐答案
问题
CGRect r = [text boundingRectWithSize:CGSizeMake(200, 0)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]}
context:nil];
是 boundingRectWithSize
,它决定了最大值CGRect可以有。
is boundingRectWithSize
which determines the maximum value that CGRect can have.
我遇到这个问题的方法是检查它是否超过,如果没有,则文本可以放入标签中。我是通过使用循环来完成的。
My solution for this problem is to check if it exceeds, if not then text can fit into the label. I did it by using loops.
NSString *text = @"This is a long sentence. Wonder how much space is needed?";
CGFloat width = 100;
CGFloat height = 100;
bool sizeFound = false;
while (!sizeFound) {
NSLog(@"Begin loop");
CGFloat fontSize = 14;
CGFloat previousSize = 0.0;
CGFloat currSize = 0.0;
for (float fSize = fontSize; fSize < fontSize+6; fSize++) {
CGRect r = [text boundingRectWithSize:CGSizeMake(width, height)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fSize]}
context:nil];
currSize =r.size.width*r.size.height;
if (previousSize >= currSize) {
width = width*11/10;
height = height*11/10;
fSize = fontSize+10;
}
else {
previousSize = currSize;
}
NSLog(@"fontSize = %f\tbounds = (%f x %f) = %f",
fSize,
r.size.width,
r.size.height,r.size.width*r.size.height);
}
if (previousSize == currSize) {
sizeFound = true;
}
}
NSLog(@"Size found with width %f and height %f", width, height);
每次迭代后,高度和宽度的大小增加其值的10%。
After each iteration the size of height and width increments 10% of its value.
我选择6的原因是因为我不希望标签过于软化。
The reason why I picked 6 is because I did not want the label to be too squishy.
对于没有标签的解决方案使用循环:
For a solution that does not use loops:
NSString *text = @"This is a long sentence. Wonder how much space is needed?";
CGFloat width = 100;
CGFloat height = 100;
CGFloat currentFontSize = 12;
CGRect r1 = [text boundingRectWithSize:CGSizeMake(width, height)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:currentFontSize+6]}
context:nil];
CGRect r2 = [text boundingRectWithSize:CGSizeMake(width, height)
options:NSStringDrawingUsesFontLeading
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:currentFontSize+6]}
context:nil];
CGFloat firstVal =r1.size.width*r1.size.height;
CGFloat secondVal =r2.size.width*r2.size.height;
NSLog(@"First val %f and second val is %f", firstVal, secondVal);
if (secondVal > firstVal) {
float initRat = secondVal/firstVal;
float ratioToBeMult = sqrtf(initRat);
width *= ratioToBeMult;
height *= ratioToBeMult;
}
NSLog(@"Final width %f and height %f", width, height);
//for verifying
for (NSNumber *n in @[@(12.0f), @(14.0f), @(17.0f)]) {
CGFloat fontSize = [n floatValue];
CGRect r = [text boundingRectWithSize:CGSizeMake(width, height)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]}
context:nil];
NSLog(@"fontSize = %f\tbounds = (%f x %f) = %f",
fontSize,
r.size.width,
r.size.height,r.size.width*r.size.height);
firstVal =r.size.width*r.size.height;
}
最后一个循环证明较大的字体可以提供更大的结果。
Where the last loop is proof that larger font can give a higher size result.
这篇关于计算UILabel文本大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!