我有一个视图控制器,它有一个UITableView实例,并使用自动布局约束来呈现它。我希望在这个表格视图中有可变的单元格高度。我不想自己计算细胞高度,因为我有一个复杂的细胞内容,由几个标签和图像组成,这些标签和图像可以因细胞而异。我相信可以让自动布局单元格调整自己的大小,使其包含所有子视图(即,在将文本分配给?之后,使用标签的sizeToFit方法)。
我有一个自定义单元格类,它使用自动布局的可视化约束格式来定位它的子视图。我尝试将这里提出的方法和它的示例实现合并在这里。
在初始化表视图时,我创建了一个数据行长度相等的数组,并通过将值赋给类型为MyCustomCell的原型单元格来计算每行的高度,并使用以下方法检索其高度
[cell systemLayoutSizeFittingSize:UILayoutFittingExpandedSize].height
并将其存储在heights数组中,以便稍后在表视图的heightForRowAtIndexPath方法中使用它来检索单个单元格的正确单元格高度。
但是,在执行所有这些操作时,我最终在xCode中出现了一个不可读的异常NSInternalInconsistencyException,其内容为“无法找到用于传入头myCustomCell:0xA8A1430.Width的传出行头,这永远不会发生。”
下面是我的自定义单元格中子视图的初始化:
_titleLabel = [[UILabel alloc] init];
_titleLabel.font = [TSTheme boldThemeFontOfSize:TSThemeFontSizeSmall];
_titleLabel.textColor = [[TSTheme sharedTheme] darkTextColor];
_titleLabel.backgroundColor = [UIColor clearColor];
_titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
_titleLabel.font = [UIFont fontWithName:@"HelveticaNeue-CondensedBold" size:19];
_titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
[self.contentView addSubview:_titleLabel];
_summaryLabel = [[UILabel alloc] init];
_summaryLabel.font = [TSTheme boldThemeFontOfSize:TSThemeFontSizeSmall];
_summaryLabel.backgroundColor = [UIColor clearColor];
_summaryLabel.textColor = [[TSTheme sharedTheme] darkTextColor];
_summaryLabel.translatesAutoresizingMaskIntoConstraints = NO;
_summaryLabel.numberOfLines = 0;
_summaryLabel.preferredMaxLayoutWidth = 250.0f; // required for text wrapping
_summaryLabel.font = [UIFont fontWithName:@"Georgia" size:14];
_summaryLabel.lineBreakMode = NSLineBreakByWordWrapping;
[self.contentView addSubview:_summaryLabel];
_thumbnailView = [[UIImageView alloc] init];
_thumbnailView.translatesAutoresizingMaskIntoConstraints = NO;
[self.contentView addSubview:_thumbnailView];
和自定义单元格的约束如下所示
NSDictionary *views = NSDictionaryOfVariableBindings(_titleLabel, _summaryLabel, _thumbnailView);
NSDictionary *metrics = @{@"margin": @"5"};
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(margin)-[_thumbnailView(<=60)]-(margin)-[_titleLabel]-(margin)-|"
options:0
metrics:metrics
views:views]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(margin)-[_thumbnailView]-(margin)-|"
options:0
metrics:metrics
views:views]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(margin)-[_titleLabel]-(0)-[_summaryLabel]"
options:0
metrics:metrics
views:views]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(margin)-[_thumbnailView]-(margin)-[_summaryLabel]-(margin)-|"
options:0
metrics:metrics
views:views]];
-
目标C:
// in ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
@property IBOutlet UITableView * table;
@end
// in ViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
self.table.dataSource = self;
self.table.delegate = self;
self.table.rowHeight = UITableViewAutomaticDimension;
self.table.estimatedRowHeight = UITableViewAutomaticDimension;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewAutomaticDimension;
}
斯威夫特:
@IBOutlet weak var table: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Don't forget to set dataSource and delegate for table
table.dataSource = self
table.delegate = self
// Set automatic dimensions for row height
table.rowHeight = UITableViewAutomaticDimension
table.estimatedRowHeight = UITableViewAutomaticDimension
}
// UITableViewAutomaticDimension calculates height of label contents/text
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
对于UITableviewCell中的label实例
注意:如果您有多个标签(uiellements)具有动态长度,应该根据其内容大小进行调整:对于您想要以更高优先级展开/压缩的标签,请调整“内容拥抱和压缩抵抗优先级”(content Hugging and Compression resistant priority)。
我使用这段代码来计算一行的高度,因为每一行的内容都不同:
-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ // Hacer que el tamaño de la celda sea variable dependiendo del tamaño del texto a mostrar
NoticiaAsignatura_DTO *rowData = [[NoticiaAsignatura_DTO alloc] init];
rowData = [self.listaNoticias objectAtIndex:[indexPath row]];
NSString *text = rowData.title;
text = [text stringByAppendingString:@"\n"];
text = [text stringByAppendingString: rowData.publish_date_ansi];
text = [text stringByAppendingString:@"\n\n"];
text = [text stringByAppendingString:rowData.content];
text = [text stringByAppendingString:@"\n\n"];
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){
CGSize constraint = CGSizeMake(700,200000.0);
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping];
return size.height + (CELL_CONTENT_MARGIN * 2);
}
else{
CGSize constraint = CGSizeMake(300,200000.0);
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE_PHONE] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping];
NSLog(@"Size: %f ", size.height);
return size.height + (CELL_CONTENT_MARGIN * 2);
}
}
希望有帮助。
当我使用一个表格视图单元格(它直接作为原型添加到情节提要中的UITableView)并使用DeQueueReusableCellWithIdentifier:获取用于缓存高度的单元格时,我遇到了这种情况。
如果我把单元格移到一个单独的笔尖中,那么它就实例化单元格来直接从笔尖上确定高度,这个问题就解决了。
然后可以向UITableView注册nib。希望这能帮上忙。
对于我的表视图单元格的动态高度,我从此链接中引用。在 UITableView 中使用自动布局进行动态单元格布局 这是我的表视图数据源和委托方法的代码 我有 2 个问题: > 我的问题是我在线路附近收到错误 在和。 为什么我必须在单元格中同时写入标签文本“和? 另外,我是否缺少实现单元动态高度所需的任何内容?
我有一个带有一堆单元格的表视图(自定义单元格,它只有它的内容视图)。 在 中,我正在向自定义单元格的content视图添加一个预定义的UIView(它有几个子视图)。我之前为UIView及其子视图设置了所有约束。 最后但并非最不重要的是,我为我的自定义单元格的内容视图(superview)和UIView设置了垂直和水平约束,UIView是在(subview)之前添加的。 约束字符串如下所示: 不幸
我试图创建一个动态消息单元格使用自动布局。 在大多数情况下,单元定位正确,自动布局具有以下限制: 我的第一个问题是邮件标签(可复制标签)宽度受到限制。这似乎可以通过使用本问题中描述的来解决。 身高仍然是个问题。正如你所看到的,信息泡沫仍在被切断。此外,我不确定如何确定表视图的消息单元格高度。 我希望自动布局能以某种方式正常工作。我已经在这里读到了答案,但似乎需要很多步骤。 首先,自动布局比传统的框
在过去的几天里,我试图使用自动布局约束完成一个相当简单(至少应该是这样)的布局,但没有成功。 我的视图层次结构是:< br> UIScrollView - UIView(容器视图)< br> - UILabel(多行标签)< br >-ui webview < br >-ui label < br >-ui button 所需的功能是根据内容的大小扩展容器视图。为了增加UIWebView的高度,我
我为包含和的自定义单元格创建了一个文件。宽度是固定的,但高度应根据下载图像的大小进行调整。 此外,单元格高度应该调整,以保持它与图像视图之间的边距。 当我读到几篇关于自动布局的文章时,我不太确定我在这里做了什么:(如果有任何错误,请指出正确的方法) > 为了保持和之间的边距,我应该创建一个约束。 前一步是通过选择和>,然后转到编辑器- 到目前为止,假设如果我调整图像视图的高度,单元格会自动调整自己
我使用自动布局的动态高度表格单元格,在表格单元格内部,有1个动态高度UILabel和1个动态UIView,其中包括多个UIImageView。 这是布局:情节提要屏幕截图 TableCell: 但我犯了这个错误: 请帮助我,我错过了什么。提前谢谢你。