旋转时表格单元内标签的动态高度
Posted
技术标签:
【中文标题】旋转时表格单元内标签的动态高度【英文标题】:Dynamic height of label inside UITableCell on rotation 【发布时间】:2013-07-20 14:51:43 【问题描述】:我想要的是一个以卡片形式呈现的帖子的表格视图。 (例如在 Facebook 应用中)
我用自定义的 uitablecell 制作了一个动态的 uitableview,并在那里放置了一个带有 2 个标签的 uiview - 标题和副标题。单元格高度是根据 heightForRowAtIndexPath 内预测的标签高度手动测量的,标签高度是通过低优先级高度约束自动测量的。
在纵向模式下一切都很好。一旦方向更改为横向 - 它内部的 uitablecell 和 uiview 会完美地改变它们的高度,但由约束控制的标签高度保持与旋转前相同。
Some screenshots
更新:
Just made a bottom space constraint...我真的不敢相信,因为我之前一直在这样做,但没有任何帮助,但一切看起来都接近正常。仍然存在一点标签高度滞后..
代码:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
NSInteger title_size = 17;
NSInteger subtitle_size = 14;
NSInteger card_horizontal_margin = 10 * 2;
NSInteger cell_horizontal_margin = 10 * 2;
NSInteger full_horizontal_margin = card_horizontal_margin + cell_horizontal_margin;
NSInteger nameHeight = 0;
NSInteger descHeight = 0;
NSArray *items = [userDefaults objectForKey: feedType];
NSString *descText = [[items valueForKey:@"description"] objectAtIndex:indexPath.row];
NSString *nameText = [[items valueForKey:@"name"] objectAtIndex:indexPath.row];
NSInteger line_width = self.tableView.frame.size.width - full_horizontal_margin;
if (![nameText isEqual:[NSNull null]])
CGSize nameTextSize = [nameText sizeWithFont:[UIFont boldSystemFontOfSize:title_size] constrainedToSize:CGSizeMake(line_width, 1000.0f) lineBreakMode:NSLineBreakByWordWrapping];
nameHeight = nameTextSize.height;
if (![descText isEqual:[NSNull null]])
CGSize descTextSize = [descText sizeWithFont:[UIFont systemFontOfSize:subtitle_size] constrainedToSize:CGSizeMake(line_width, 1000.0f) lineBreakMode:NSLineBreakByWordWrapping];
descHeight = descTextSize.height;
NSInteger full_height = nameHeight + descHeight + 50;
return full_height;
我是如何解决这个问题的
刚刚为每个标签制作了2个高优先级约束,并在单元类的layoutSubviews方法中测量它们。这非常简单,现在一切正常。
【问题讨论】:
您是否尝试过添加从字幕底部到单元格底部的约束? 【参考方案1】:如果您希望标签高度随单元格高度而变化,只需确保单元格顶部和底部都有高度限制,并且没有固定高度限制。如果您的两个标签彼此重叠,则顶部的标签应该对单元格的顶部有一个约束,一个从其底部到底部标签的顶部。底部标签应该在单元格底部有一个。
【讨论】:
一切都像你说的那样,除了两件事:1.间距约束连接到单元格内的uiview。 2. 我没有对该 uiview 底部的间距限制,因为我一直在尝试这样做,即使在原始方向上也存在问题。一切都显示在图片中 尝试从字幕标签底部到 UIView 底部添加一个约束,然后删除标签上的高度约束。 s2.ipicture.ru/uploads/20130720/nH715h3C.png 肖像仍然可以,但风景看起来完全坏了。 @DenisSmirnov,如果没有看到计算高度并为单元格返回新高度的代码,我无法判断出了什么问题。请在您的问题中发布该代码。 @DenisSmirnov,看起来问题在于约束系统不知道如何划分两个标签之间的空间——一个标签太少,另一个标签太多。我不知道如何解决这个问题——你可能必须给其中一个标签一个固定的高度,并在计算它的大小后在代码中修改它。您可以在 IB 中为高度约束创建一个 IBOutlet,然后在代码中更改其常量值,例如: self.heightCon.constant = nameHeight;其中 heightCon 是高度约束的 IBOutlet。以上是关于旋转时表格单元内标签的动态高度的主要内容,如果未能解决你的问题,请参考以下文章