在UIImageView和UITableViewCell之间添加NSLayoutConstraint

问题描述:

我试图在UITableViewController中的两个元素之间添加约束,到目前为止,我还没有做到。在UITableViewController里面,但在UITableView Cell之外的UIImage视图。在UIImageView和UITableViewCell之间添加NSLayoutConstraint

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

我试图添加约束的原因是因为UIImageView动态调整大小的下载图像的大小。无论何种原因无法下载图像时,都会使用默认图像,整个版面会分开。

这里是我的tableView的样子:

enter image description here

+0

你有没有考虑加入您的UIImageView到的UITableViewCell和将它作为tableView中的第一个单元格,并在每次从服务器获取图像时更改单元格的高度? –

+0

@noir_eagle,不,我没有,但这是一个好主意。我会给它一个镜头。谢谢。 – Sicypher

+0

@noir_eagle你应该发表你的评论作为答案。我会接受它作为最好的答案,因为它最适合我。 – Sicypher

您可以考虑来包装你UIImageViewUITableViewCell,并把它作为UITableView第一个单元格。此外,您可以将表格视图中的单元格层次细分为两部分,这样可以简化对单元格的跟踪。所以第一部分将只包含UIImageView单元格,第二部分将包含您的主单元格。

每当你会得到从网络请求表示该图像获取的响应,你可以调用tableView.reloadSections(IndexSet(integer: 0), with: .none)和委托方法返回正确的高度

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

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

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

例如,如果下载的图像宽度是imageCellWidth,并且您的超大图像应该是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;