【问题标题】:Add NSLayoutConstraint between UIImageView and UITableViewCell在 UIImageView 和 UITableViewCell 之间添加 NSLayoutConstraint
【发布时间】:2017-11-14 05:05:55
【问题描述】:

我正在尝试在 UITableViewController 内的两个元素之间添加约束,但到目前为止,我还无法做到。 UIImage View 在 UITableViewController 内部,但在 UITableView Cell 外部。

我既不能使用 StoryBoard,也不能以编程方式添加约束,因为 Xcode 告诉我不能在要重用的对象上添加约束。

我尝试添加约束的原因是 UIImageView 会根据下载的图像大小动态调整大小。当图像由于某种原因无法下载时,它会使用默认图像,整个布局就会崩溃。

这是我的 tableView 的样子:

【问题讨论】:

  • 您是否考虑过将您的 UIImageView 添加到 UITableViewCell 并将其作为 tableView 中的第一个单元格并在您从服务器获取图像时更改单元格的高度?
  • @noir_eagle,不,我没有,但这是个好主意。我会试一试。谢谢。
  • @noir_eagle 您应该发表您的评论作为答案。我会接受它作为最佳答案,因为它最适合我。
  • 完成。请检查答案,如果不清楚,请告诉我。

标签: ios uitableview uiimageview storyboard nslayoutconstraint


【解决方案1】:

您可以考虑将UIImageView 包装成UITableViewCell 并将其作为UITableView 中的第一个单元格。此外,您可以将表格视图中单元格的层次结构分解为 2 个部分,这样可以简化对单元格的跟踪。因此,第一部分将仅包含 UIImageView 单元格,第二部分将包含您的主单元格。

每当您从网络请求中获得表明已获取图像的响应时,您都可以调用tableView.reloadSections(IndexSet(integer: 0), with: .none) 并在委托方法中返回正确的高度

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) {
  if indexPath.section == 0 {
    return imageHeight
  }
}

【讨论】:

    【解决方案2】:

    问题是约束设置了两个对象之间的关系。由于您的 tableViewCell 将被重用,因此您无法将约束设置为在单元格之外的对象。

    实际上,您可以根据 cellImageView 的大小以编程方式获取单元格上图像的大小并设置约束到 ImageView 之外。

    例如,如果下载的图片宽度是imageCellWidth,那么你的超大imageView应该大2倍。

    NSLayoutConstraint *imageViewWidth = [NSLayoutConstraint
                                         constraintWithItem:imageView
                                         attribute:NSLayoutAttributeWidth
                                         relatedBy:NSLayoutRelationEqual
                                         toItem:nil
                                         attribute:NSLayoutAttributeNonAnAttribure
                                         multiplier:1.0f
                                 constant:imageCellWidth*2];
    [imageView addConstraint: imageViewWidth];
    

    如果需要动态改变这个约束,只需要改变常量值

    imageViewWidth.constant = newWidth;
    

    【讨论】:

      猜你喜欢
      • 2018-06-01
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多