我目前有一个自定义UITableViewCell
,其中包含许多标签。并非所有这些标签都必然具有价值,但他们可以做到 - 而且它们可能是多线的(至少有2个标签始终可见)。如果没有任何文字,那么标签应该崩溃。我想要实现的是每个标签只占用它所需的高度,并且它们都相互对接。我已经完成了所有这些工作,除了我最后希望在最后一个标签和单元格内容视图之间的底部边距为11,并相应地调整单元格高度。这是我似乎无法使约束正常工作的唯一一点。
我通过创建虚拟单元格正确地返回正确的高度,并且在我的cellForRowAtIndexPath
方法中,我尝试相应地设置单元格和单元格的内容视图框架。但是在屏幕上呈现的单元格高度始终与在xib中定义的单元格高度相同。
我知道这里缺少代码,但我的所有约束都已在IB中定义,每个标签都有一个用于with的尾随和前导空格,以及一个顶部空格为0到它上面的标签。顶部标签有一个顶部空间,用于为内容视图创建顶部边距,但是只要我在底部标签上执行此操作,它就会拉伸标签的高度以适应所有约束。
我在这里看到了与2个标签相关的各种教程和问题,其中1可能是可变大小,但我无法根据我想要实现的目标调整任何解决方案。
答案 0 :(得分:1)
好的,
获取所需数量的标签(假设您希望单元格内有2个标签) 在故事板中创建高度为1的2个标签,或者如果以编程方式添加它们,则可以这样做。
UILabel *myLabel1 = [[UILabel alloc]initWithFrame:[CGRectMake:(x,y,width,1)]; // assuming you know their x,y and width respectively as you need them.
现在为标签添加约束(确保使它们不明确,否则方向会搞乱它):
3 a。高度 - (应等于或大于=> 1)。 湾宽度 - [设置宽度],确保优先级高于其他宽度但小于高度 C。固定尾随和前导空间,以及超视图顶部和底部。 d。如果有两个标签,请确保单击它们并根据需要添加垂直或水平空间。
我认为这会使它含糊不清。 (当我写下关于自动布局的内容时,我告诉这些,所以尽管取向,这将永远不会出现任何布局问题。)
添加一个片段,当您知道该字符串时,该片段将计算Label的高度。
CGSize constrainedSizeOfMessege = CGSizeMake(widthOfLabel, 9999);//150,180 anything you like
NSDictionary *attributesDictionaryMessege = [NSDictionary dictionaryWithObjectsAndKeys:
[UIFont fontWithName:@"System Italics" size:16.0], NSFontAttributeName,
nil];
NSMutableString *myString = [[NSMutableString alloc]initWithString:[[friendsInstanceArray objectAtIndex:indexPath.row] myString] attributes: attributesDictionaryMessege];
CGRect requiredHeightMessege = [myString boundingRectWithSize:constrainedSizeOfMessege options:NSStringDrawingUsesLineFragmentOrigin context:nil];
在
中添加上述代码现在,计算Cell的高度,如果它们是1个高度,则计算所有标签的高度 返回故事板中单元格的高度+预期标签大小的高度。
所以该方法看起来像。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
CGSize constrainedSizeOfMessege = CGSizeMake(widthOfLabel, 9999);//150,180 anything you like
NSDictionary *attributesDictionaryMessege = [NSDictionary dictionaryWithObjectsAndKeys:
[UIFont fontWithName:@"System Italics" size:16.0], NSFontAttributeName,
nil];
NSMutableString *myString = [[NSMutableString alloc]initWithString:[[friendsInstanceArray objectAtIndex:indexPath.row] myString] attributes: attributesDictionaryMessege];
CGRect requiredHeightMessege = [myString boundingRectWithSize:constrainedSizeOfMessege options:NSStringDrawingUsesLineFragmentOrigin context:nil];
int heightOfMessege = requiredHeightMessege.size.height;
//if cell height is 50 then return 50+heightOfMessege
return 50+heightOfMessege;
}
并且YES POSITIVELY设置,mylabel.numberOfLines = 0;
希望这可以帮助你
答案 1 :(得分:0)
如果你想在自己的位置贴上标签,包括空白空间,而不是在标签的标题文字中留一个空格,这样就不会让文字变空,而且标签会贴在位置上。强>