[英]How to change UILabel height according to content in iOS
I am facing a problem on dynamic Label height.My requirement is like below image: 我在动态标签高度上遇到问题。我的要求如下图所示:
I am taking a UIScrollView
and on UIScrollView
I am adding UILabel
for showing content. 我正在使用
UIScrollView
并在UIScrollView
添加了UILabel
以显示内容。 My content is different type of text size. 我的内容是不同类型的文本大小。 If I set 1 content its coming perfect but if I take content within a Array then its coming like below image:
如果我将1个内容设置为完美,但是如果我将内容放置在Array中,则它如下图所示:
There are 6 content with different size of text. 有6种内容,其文字大小不同。 I implement this type:
我实现了这种类型:
UIScrollView *scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 42, SCREEN_WIDTH, SCREEN_HEIGHT - 152)];
[scroll setBackgroundColor:[UIColor clearColor]];
[scroll setContentOffset:CGPointMake(0, 0)];
[scroll setShowsHorizontalScrollIndicator:NO];
[scroll setShowsVerticalScrollIndicator:NO];
[self.view addSubview:scroll];
contentArr = [[NSArray alloc] initWithObjects:@"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla",@"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",@"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ",@"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu",@"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla",@"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et ", nil];
float x_pos = 5;
float y_pos = 5;
for (int i = 0; i < contentArr.count; i ++)
{
NSString *text1 = [contentArr objectAtIndex:i];
CGSize constraint1 = CGSizeMake(152.5, 2000);
CGSize size1 = [text1 sizeWithFont:[UIFont systemFontOfSize:12] constrainedToSize:constraint1 lineBreakMode:NSLineBreakByWordWrapping];
NSLog(@"size1.height == %f",size1.height);
UIView *bgView = [[UIView alloc] initWithFrame:CGRectMake(x_pos,y_pos,152.5,size1.height)];
bgView.backgroundColor = APP_BGCOLOR;
[scroll addSubview:bgView];
[bgView.layer setBorderColor:[[UIColor colorWithRed:(170.0 / 255.0) green:(170.0 / 255.0) blue:(170.0 / 255.0) alpha:0.5] CGColor]];
[bgView.layer setBorderWidth:1.0f];
bgView.layer.cornerRadius = 4.0;
bgView.layer.masksToBounds = YES;
UILabel *lblComment = [[UILabel alloc] initWithFrame:CGRectMake(7,20,bgView.frame.size.width -14,bgView.frame.size.height - 20)] ;
[lblComment setLineBreakMode:NSLineBreakByWordWrapping];
lblComment.numberOfLines = size1.height/15;
[lblComment setFont:[UIFont systemFontOfSize:10]];
lblComment.text = text1;
lblComment.backgroundColor = [UIColor clearColor];
lblComment.tag = 1;
[lblComment setNeedsDisplay];
[bgView addSubview:lblComment];
x_pos = x_pos + 157.5;
if (x_pos > 300)
{
x_pos = 5;
y_pos = y_pos + size1.height + 10;
}
[scroll setContentSize:CGSizeMake(SCREEN_WIDTH, y_pos)];
}
If I take only 1 content and write code for dynamic text height before For loop then its coming like 2nd Image. 如果我只接受1个内容并在For循环之前编写用于动态文本高度的代码,则其效果将类似于2nd Image。
I am following this code: 我正在遵循以下代码:
NSString *text1 = @"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.";
CGSize constraint1 = CGSizeMake(152.5, 2000);
CGSize size1 = [text1 sizeWithFont:[UIFont systemFontOfSize:12] constrainedToSize:constraint1 lineBreakMode:NSLineBreakByWordWrapping];
How to solve this issue? 如何解决这个问题?
If any idea, Please suggest me... 如果有任何想法,请建议我...
There are some ways you could do that: 有几种方法可以做到这一点:
#1 caculate textSize then set to label: #1计算textSize然后设置为label:
- (CGSize)calculateSizeWithNSString:(NSString *)str {
CGSize constraint1 = CGSizeMake(LABEL_WIDTH, FLT_MAX);
UIFont *font = [UIFont systemFontOfSize:12];
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
paragraph.lineBreakMode = NSLineBreakByWordWrapping;
NSDictionary *attributesDictionary = [NSDictionary
dictionaryWithObjectsAndKeys:font, NSFontAttributeName, paragraph,
NSParagraphStyleAttributeName, nil];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f) {
CGRect rect = [str boundingRectWithSize:constraint1
options:(NSStringDrawingUsesLineFragmentOrigin |
NSStringDrawingUsesFontLeading)
attributes:attributesDictionary
context:nil];
constraint1 = rect.size;
} else {
//sizeWithFont:constrainedToSize:lineBreakMode: was deprecated from iOS7.0
constraint1 = [str sizeWithFont:font
constrainedToSize:constraint1
lineBreakMode:NSLineBreakByWordWrapping];
}
return constraint1;
}
#2 Set text to label then use sizeThatFit: method to calculate true size contraint: #2将文本设置为标签,然后使用sizeThatFit:方法计算真实大小的约束:
- (void)changeLabelSize:(UILabel *)label {
CGRect labelFrame = label.frame;
CGSize constraint1 = CGSizeMake(LABEL_WIDTH, FLT_MAX);
CGSize expectSize = [label sizeThatFits:constraint1];
labelFrame.size = expectSize;
label.frame = labelFrame;
}
I think sizeThatFits:
is a better option than [label sizeToFit]
in this case because you want to supply one of the dimensions (the column width) as an argument: (big thank Jef for correct me) 我认为在这种情况下,
sizeThatFits:
比[label sizeToFit]
是更好的选择,因为您想提供一个尺寸(列宽)作为参数:(非常感谢杰夫纠正我)
#EDIT: Use method 2: #EDIT:使用方法2:
//.....
// remove this line you dont need it any more
CGSize size1 = [text1 sizeWithFont:[UIFont systemFontOfSize:12] constrainedToSize:constraint1 lineBreakMode:NSLineBreakByWordWrapping];
//...
[lblComment setFont:[UIFont systemFontOfSize:10]];
lblComment.text = text1;
[self changeLabelSize:lblComment];
CGSize size1 = lblComment.frame.size; //for your calculate x_pos, y_pos code
[bgView addSubview:lblComment];
//....
I have an idea for calculate x_pos, y_pos 我有一个计算x_pos,y_pos的想法
float col1_y_pos = 5;
float col2_y_pos = 5;
for (int i = 0; i < contentArr.count; i ++)
{
BOOL isColumn1 = (i%2 == 0)
float x_pos = isColumn1 ? 5 : column2_x_pos_value;
float y_pos = isColumn1 ? col1_y_pos: col2_y_pos;
//your code set label frame with x_pos, y_pos
//....
CGSize size1 = lblComment.frame.size;
[bgView addSubview:lblComment];
if (isColumn1) {
col1_y_pos += size1.height + marginTop;
} else {
col2_y_pos += size1.height + marginTop;
}
//....
You are having two columns for your texts. 您的文本有两列。 Labels in each row are different heights and you are having only 1 float
y_pos
to set label position. 每行中的标签高度不同,您只有1个浮点
y_pos
来设置标签位置。 If you can see every label
in first column is placed equal to column 2 label only because you are maintain y_pos
according to 2nd column. 如果您看到第一列中的每个
label
都被放置为与第二列标签相等,则仅是因为您根据第二列维护y_pos
。 You need to maintain y_posLeft
y_posRight
. 您需要维护
y_posLeft
y_posRight
。
float x_pos = 5;
float y_posLeft = 5;
float y_posRight = 5;
for (int i = 0; i < contentArr.count; i ++)
{
NSString *text1 = [contentArr objectAtIndex:i];
// UIView *bgView = [[UIView alloc] initWithFrame:CGRectMake(x_pos,y_pos,152.5,9999)];
// bgView.backgroundColor = [UIColor lightGrayColor];
// [scroll addSubview:bgView];
UILabel *lblComment = [[UILabel alloc] initWithFrame:CGRectMake(x_pos, (i%2 == 1)?y_posRight:y_posLeft, 152.5, 1999)] ;
[lblComment setLineBreakMode:NSLineBreakByWordWrapping];
lblComment.numberOfLines = 0;
[lblComment setFont:[UIFont systemFontOfSize:10]];
lblComment.backgroundColor = [UIColor whiteColor];
lblComment.text = text1;
[self changeLabelSize:lblComment];
CGSize size1 = lblComment.frame.size;
[scroll addSubview:lblComment];
[lblComment.layer setBorderColor:[[UIColor lightGrayColor] CGColor]];
[lblComment.layer setBorderWidth:1.0f];
lblComment.layer.cornerRadius = 4.0;
lblComment.layer.masksToBounds = YES;
if (x_pos == 5)
{
y_posLeft = y_posLeft + size1.height + 10;
}
else
{
y_posRight = y_posRight + size1.height + 10;
}
x_pos = x_pos + 157.5;
if (x_pos > 300)
{
x_pos = 5;
}
[scroll setContentSize:CGSizeMake([[UIScreen mainScreen] bounds].size.width, MAX(y_posLeft, y_posRight))];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.