Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 具有不同UITableViewCells和动态内容的UITableView_Ios_Swift_Uitableview - Fatal编程技术网

Ios 具有不同UITableViewCells和动态内容的UITableView

Ios 具有不同UITableViewCells和动态内容的UITableView,ios,swift,uitableview,Ios,Swift,Uitableview,在我们的应用程序中,我们经常使用类型为数据源的显示项目列表,使用UITableViews在可滚动列表中显示不同的自定义uitableviewcell。在TableView的cellforRowAt函数中,我们根据显示项目的类型决定使用哪个自定义UITableViewCell 这种方法现在在从internet加载和显示图像的UITableViewCell中造成了问题,因为视图还不知道图像的大小 这是我尝试构建的自定义视图: 但是,我试图从自定义视图中的图像开始。由于TableView行不知道图像将

在我们的应用程序中,我们经常使用类型为数据源的显示项目列表,使用
UITableViews
在可滚动列表中显示不同的自定义
uitableviewcell
。在
TableView
cellforRowAt
函数中,我们根据显示项目的类型决定使用哪个自定义
UITableViewCell

这种方法现在在从internet加载和显示图像的
UITableViewCell
中造成了问题,因为视图还不知道图像的大小

这是我尝试构建的自定义视图:

但是,我试图从自定义视图中的图像开始。由于
TableView
行不知道图像将有多大,因此视图出现时不显示图像。只有在向下和向上滚动到图像应该位于的位置后,单元格才会按照我的要求调整大小。我将图像的顶部、前导和尾随约束设置为0,以便图像完全填充单元格

加载图像并在这样的单元格中显示图像的最佳实践是什么?单元格的大小取决于实际图像的大小

viewDidLoad
I设置中

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 80
cellForRowAtIndexPath

let cell: CustomTableViewCell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell", for: indexPath) as! CustomTableViewCell
cell.imageView.contentMode = .scaleAspectFit
tableView.beginUpdates()
cell.imageView.kf.setImage(with: URL(string: item.getImageUrl()), placeholder: nil, options: nil, progressBlock: nil) { (image, error, cacheType, url) in
    tableView.endUpdates()
}
cell.isUserInteractionEnalbed = false
cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: .greatestFiniteMagnitude)
cell.accessoryType = .none

return cell

配置tableview或加载视图时: 写下这些:

yourTableView.estimatedRowHeight = 70.0 // this can be any height you want to set when table loads first time.
yourTableView.rowHeight = UITableViewAutomaticDimension

或者,如果您正在从storyboard/xib进行配置,则可以从storyboard/xib中设置这些设置。请参见此处的uitableview设置。

一种解决方案可以在图像下载完成后重新加载该特定行(如果可见)

tableView.reloadRows(at: [indexPathForRow], with: .none)

正如您所说的,在向下和向上滚动增益后,图像会得到完美的显示,我相信这个解决方案应该会起作用。

终于找到了问题所在。我显示的数据是由演示者提供的,而不是最初的演示者提供的。这就是为什么我在获得数据后调用
tableView.reloadData()
。问题是我没有在主线程中显式调用该方法

DispatchQueue.main.async {
    tableView.reloadData()
}

您正在从网络api加载图像吗?我使用库将图像从internet加载到UIImageViews中。我可以知道你从哪里得到图像URL吗?请确保你已经为行高设置了自动尺寸,并且你有从单元格顶部到底部的约束。您还必须从
estimatedHeightForRow
返回一些值,最后,在加载图像时,调用
beginUpdates
,然后调用
endUpdates
,以获取表视图以重新显示可见图像cells@MuhammedAzharudheen:无需计算高度和宽度,可以很容易地通过自调整大小的细胞来完成。没有给我带来任何变化