gpt4 book ai didi

ios - 动态 UITableViewCell 在 iOS 7 和 iOS 8 中的高度是不可能的

转载 作者:搜寻专家 更新时间:2023-10-30 20:16:59 25 4
gpt4 key购买 nike

我很难尝试使用动态大小的单元格在 iOS 7 和 8 下很好地布局表格 View 。我无法详细说明要找到的所有差异(以“方式”的方式iOS 7 和 8 之间的损坏布局”),可以使用不同的“调整”、“解决方法”以及我在这里和其他地方找到的任何内容来生成。但最终在 iOS 7 或 iOS 8(如果不是两者)上,部分或所有单元格的内容未对齐,因为布局系统“破坏”了自定义约束之一以“恢复”。

基本上我有三种不同类型的内容。因为我不仅在上述表格 View 中显示这些内容,所以我将内容包装在 UIView 的三个子类中。 .我们称他们为SummaryView秒对于表格 View ,我创建了 UITableViewCell 的三个子类。其中每个都添加了相应的 SummaryView到它的contentView并设置 self.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight .在 updateViewConstraints我通常会删除之前可能添加的所有“我的”约束并执行...

- (void)updateConstraints
{
// ...removed custom constraints before
NSDictionary *views = NSDictionaryOfVariableBindings(_summaryView);

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_summaryView]-|"
options:0
metrics:nil
views:views]
toView:self.contentView];

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[_summaryView]-|"
options:0
metrics:nil
views:views]
toView:self.contentView];
[super updateConstraints];
}

tableView:estimatedHeightForRowAtIndexPath:我根据内容的类型返回静态估计。在 tableView:heightForRowAtIndexPath:我以...的方式使用“原型(prototype)”单元格

// ..set content on prototype cell before
[prototypeCell setNeedsUpdateConstraints];
[prototypeCell layoutIfNeeded];
CGSize size = [prototypeCell systemLayoutSizeFittingSize:UILayoutFittingExpandedSize];
return size.height;

调试器通常会在 UIViewAlertForUnsatisfiableConstraints 处中断(在 [prototypeCell layoutIfNeeded] 上)与 <NSLayoutConstraint:0x17409f180 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x17019f070(44)]>与其余约束冲突。

所以我试了...

  • 设置tableView.rowHeight = UITableViewAutomaticDimension在 TableView 的 viewDidLoad
  • 未实现 tableView:estimatedHeightForRowAtIndexPath:
  • 使用...

    if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1) {
    cell.contentView.frame = cell.bounds;
    cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleBottomMargin;
    }

    ...在应用单元格的内容并计算其布局之前

  • 正在做 self.contentView.bounds = CGRectMake(0.0, 0.0, 1000, 1000);单元初始化时
  • 可能是其他事情,现在我不记得了,因为我现在已经或多或少两天都在做这个了。

它总是一样的,如果我实现了一个不提示不可满足约束的变体,那么布局通常还是一团糟。虽然我得到的 TableView 没有设置“默认”<NSLayoutConstraint:0x17409f180 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x17019f070(44)]>约束,而不是约束集(基于 tableView:heightForRowAtIndexPath: 返回的高度)既不适合布局系统。

这篇文章是最后的手段。我知道如果没有具体 View 类的约束,您将无法重新检查它们。但由于我能够在 TableView 之外毫无问题地使用这些 View ,所以它不应该是 subview 约束的问题。

我想我会回过头来手动计算所有 View 元素的大小(基于 [UIScreen mainScreen].bounds )并将它们直接设置(作为宽度和高度)到所有 subview 。所以我能够获得单元格的具体高度并可以设置 contentView手动的框架。非常遗憾,因为它显着扰乱了布局代码....

最好的问候,加布里埃尔

最佳答案

最后我找到了一个可以接受的解决方案,它不会把布局代码弄乱太多。简而言之:

在 TableView 单元格的 updateConstraints 中,我删除了从 _summaryView-bottom 到 superview-bottom 的约束。因此内容 View 的高度限制不会影响摘要 View 的高度限制。

- (void)updateConstraints
{
NSDictionary *views = NSDictionaryOfVariableBindings(_summaryView);

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_summaryView]-|"
options:0
metrics:nil
views:views]
toView:self.contentView];

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[_summaryView]"
options:0
metrics:nil
views:views]
toView:self.contentView];
[super updateConstraints];
}

tableView:heightForRowAtIndexPath: 中,我只是使用相关单元格的 intrinsicContentSize 来获取高度:

        [prototypeCell.summaryView applyStuff];
[prototypeCell layoutIfNeeded];
height = [prototypeCell intrinsicContentSize].height;

所述 TableView 单元格的 intrinsicContentSize 的实现如下所示:

- (CGSize)intrinsicContentSize
{
// Calculate the available content width if not done yet
static CGFloat availableWidth = 0.0;
if (availableWidth == 0.0) {
availableWidth = CGRectGetWidth([UIScreen mainScreen].bounds);
}

// Check if the contentView's frame needs an update
if (CGRectGetWidth(self.contentView.frame) != availableWidth) {
CGRect frame = CGRectMake(0.0, 0.0, availableWidth, 100.0);
self.contentView.frame = frame;
}

[_summaryView layoutIfNeeded];
CGSize size = _summaryView.frame.size;
size.height += 2.0 * V_PADDING;
size.width += 2.0 * H_PADDING;
return size;
}

请注意,对于支持纵向和横向模式的应用,availableWidth 要么必须在方向更改时重置,要么不应该是static。 *_PADDING 是我希望 _summaryView 在各个方面都具有的空间。

此外,我删除了 self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth 来自单元格的初始化代码。因为它似乎没有任何明显的效果。

关于ios - 动态 UITableViewCell 在 iOS 7 和 iOS 8 中的高度是不可能的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27131520/

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