【问题标题】:Dynamically size UITableViewCell's height动态调整 UITableViewCell 的高度
【发布时间】:2015-03-25 14:08:30
【问题描述】:

我有一个 UITableViewCell 里面有多个项目。 (不仅仅是一个 textView,所以我不能遵循 this 选项。)我正在尝试根据它内部的内容动态调整它的高度。

我将要更改的高度是 UITextView 和 UIView。 textView 将不断变化(在另一种方法中,如果您愿意,我可以发布它)。如果用户单击按钮,UIView 会发生变化:

这是我的代码:

- (void)viewDidLoad
{
   self.tableView.rowHeight = UITableViewAutomaticDimension;
}

- (IBAction)thisButton:(id)sender
{   
    CGRect frame = self.myView.frame;
    frame.size.height = 50;
    frame.size.width = self.myView.frame.size.width;

    self.myView.frame = frame;

    // update 'myView's constraint
    self.viewHeight.constant = self.myView.frame.size.height;

    self.tableView.rowHeight = UITableViewAutomaticDimension;
    [myTableView reloadData];
}

问题:

  • 发生的情况是,当我按下按钮时,UIView 的高度得到了 更新了,但随后单元格中的其他所有内容都会向上移动,并且单元格保持相同的大小。

  • 当 UITextView 的高度发生变化时,它不会拉动其他所有内容 向下,并且单元格高度保持不变。虽然 textView 的 高度确实发生了变化,它只是超越了其他一切。

约束:

在 UITextView 我有 3 个约束 - 每侧 2 个,顶部 1 个。 UIView 有 3 个约束 - 每侧 2 个,底部 1 个。 然后我有一个将 UIView 连接到 textView 的约束。

【问题讨论】:

  • 您是否尝试将两个视图高度加在一起,然后将其设置为行高?
  • 您介意为您的约束拍摄屏幕截图吗?

标签: ios objective-c uitableview nslayoutconstraint


【解决方案1】:

您可以通过计算内部视图的最大高度来动态管理 UITableViewCell 大小:

NSArray *array = [[NSArray alloc] initWithArray:@[view1, view2, view3]];

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    __block CGFloat maxHeight;
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        UIView *view = obj;
        if (view.bounds.size.height > maxHeight) {
            maxHeight = view.bounds.size.height;
        }
    }];

    return maxHeight;
}

然后在更改视图尺寸的方法结束时,您必须调用[self.tableView reloadData]

【讨论】:

  • 我可以使用它,但我有多个单元格。
  • 没错。使用 [tableView cellForRowAtIndexPath:indexPath] 访问您的不同单元格。看我的更新。如果您给我更详细的代码,我可以更全面地回答。
  • 我有一个 UIViews 的 iboutlet 连接。数组中大约有 4 个。我必须为每个单元格做一个 if 语句吗?因为我不能为所有视图分配 myViewHeight。
  • 看,很简单。你让你的 myView 调整大小,然后调用 -'[self.tableView reloadData]'。当您的 tableView 正在更新时,它会调用方法 '- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath',您可以在其中询问已更改视图的新维度。在这里,您可以选择使用单元格内视图的最大更新高度。然后你返回它的值,仅此而已。
  • 但是我该怎么写这行 CGFloat myViewHeight = [tableView cellForRowAtIndexPath:indexPath].myView.frame.size.height;" if myView 是 UIViews 的数组?它不允许我写那个
猜你喜欢
  • 2011-03-05
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多