gpt4 book ai didi

ios - 代码中具有自动布局约束的 iOS UITableView 中的可变单元格高度

转载 作者:行者123 更新时间:2023-12-01 16:49:14 27 4
gpt4 key购买 nike

我有一个 View Controller ,它有一个 UITableView 实例并使用自动布局约束来呈现它。我想在这个表格 View 中有可变的单元格高度。我不想自己计算单元格高度,因为我有一个复杂的单元格内容,由多个标签和图像组成,这些标签和图像可能因单元格而异。我确实相信可以让自动布局单元调整自身大小,以便它包含所有 subview (即在为标签分配文本后使用标签的 sizeToFit 方法?)。

我有一个自定义单元格类,它使用自动布局的视觉约束格式来定位其 subview 。我尝试合并 here 中提出的方法及其示例实现 here .

当我初始化 TableView 时,我创建了一个与我的数据行长度相等的数组,并通过将值分配给类型为 MyCustomCell 的原型(prototype)单元格来计算每一行的高度,并使用它检索它的高度

[cell systemLayoutSizeFittingSize:UILayoutFittingExpandedSize].height

并将其存储在 heights 数组中,以便稍后在 TableView 的 heightForRowAtIndexPath 方法中使用它来检索各个单元格的正确单元格高度。

然而,在执行所有这些操作后,我最终在 xCode 中遇到了一个不可读的异常 NSInternalInconsistencyException,其中显示“无法为传入的行头 MyCustomCell:0xa8a1430.Width 找到传出的行头,这永远不会发生。”

这是我的自定义单元格中 subview 的初始化:

    _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]];

最佳答案

我在使用 TableView 单元格时遇到了这个问题,该单元格作为原型(prototype)直接添加到 Storyboard 中的 UITableView 并使用 dequeueReusableCellWithIdentifier: 获取用于缓存高度的单元格。

如果我将单元格移到一个单独的 Nib 中,那么它会实例化单元格以直接从 Nib 确定高度,问题就消失了。

然后你可以用 UITableView 注册 nib。希望这会有所帮助。

关于ios - 代码中具有自动布局约束的 iOS UITableView 中的可变单元格高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17551729/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com