Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.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 UITableViewCell动态行高+;自定义UIView+;自动布局_Ios_Objective C_Swift_Xcode_Uitableview - Fatal编程技术网

Ios UITableViewCell动态行高+;自定义UIView+;自动布局

Ios UITableViewCell动态行高+;自定义UIView+;自动布局,ios,objective-c,swift,xcode,uitableview,Ios,Objective C,Swift,Xcode,Uitableview,我正在尝试获取一个带有多个uiimageview的自定义照片容器,以适合我的tableview单元格。视图包含数量可变的图像(1~9),其高度将相应地从1x变为3x imageHeight 我使用AutoLayout来定义包含tableview和自定义UIView的上/下/前导/尾随页边距,并启用自调整单元格大小,我设置了 tableView.estimatedRowHeight = X tableView.rowHeight = UITableViewAutomaticDimension 我

我正在尝试获取一个带有多个
uiimageview
的自定义照片容器,以适合我的tableview单元格。视图包含数量可变的图像(1~9),其高度将相应地从1x变为3x imageHeight

我使用AutoLayout来定义包含tableview和自定义UIView的上/下/前导/尾随页边距,并启用自调整单元格大小,我设置了

tableView.estimatedRowHeight = X
tableView.rowHeight = UITableViewAutomaticDimension
我用

tableView.register(nib: forCellReuseIdentifier:)
tableView(tableView:cellForRowAt:)
方法中,我使用以下设置单元格:

let cell = tableView.dequeueReusableCell(
    withIdentifier: "test9cell", 
               for: indexPath) as! SocialFeedTableViewCell
cell.photoContainer.setup(with: urls)
cell.photoContainer.loadImages()
return cell 
其中
setup()
使用URL钩住容器中的每个imageView

func setup(with urls: [URL]) {
    self.imageUrls = urls
    for i in 0 ..< urls.count {
        let imageView = UIImageView(frame: CGRect.zero)
        self.addSubview(imageView)
        self.imageViews.append(imageView)
    }
    self.setNeedsLayout()
}

func loadImages() {
    self.imageViews.forEach { imageView in
        imageView.frame = // Calculate position for each subview
        imageView.sd_setImage(...) // Load web image asynchronously
    }
}
这里的问题是:在设置初始intrinsicContentSize之后,容器的帧大小在layoutSubviews()中会随之改变。虽然到那时我可以正确定位imageView子视图,但单元格高度将不再更改


希望我没有让这个问题变得更加混乱。有人能指出在修改UIView子视图的内容后,如何调整单元格高度吗?谢谢

这里有一些事情会导致您在动态调整单元格大小时出现一些问题

  • 您正在将多个项目添加到单元中,但没有在图像视图上定义任何自动布局约束,因此它不知道如何正确放置/堆叠项目
  • 从上面的代码中,您添加的UIImageView的帧为CGRectZero,如果没有autulayout规则,它们将在添加图像时保持为零或尝试调整为contentsize,但它们不会调整单元格高度
  • 如果要从网络加载图像,则可能会在tableviewcell完成初始渲染后添加/渲染图像。因此,您可能需要缓存加载的图像并重新加载单元格,以便它们能够在正确的时间加载
  • 最后一点要复杂得多

    Dynamic UITableViewCell根据其中内容的自动布局规则计算其高度。从内容到UITableViewCell的contentView属性(到所有边),必须有足够的约束,这些约束为单元格提供足够的信息,以便放置每个项目、计算其总体高度和宽度,从而计算新高度

    对于动态大小的单元格,仅使用一个图像并不太坏。但是,在单元格最初呈现之后,在没有任何规则的情况下动态放置多个项目将不起作用

    你需要决定这些图像应该如何在你的细胞中布局。完成此操作后,可以在添加图像视图时查看添加所需的约束。就我个人而言,我只会在收到每个图像后添加图像视图

    在此之前,当我完成此操作时,我缓存了接收到的图像,并重新加载了单元格,以便图像可以在渲染时放置在单元格中,从而允许tableview单元格根据图像尺寸和约束计算其高度


    您可能还想考虑使用集合视图或将图像合并为单个图像并在单元格中使用该图像。您可以在运行时或服务器端在设备上执行此操作,前提是您可以访问映像

    这里有一些事情会导致您在动态调整单元格大小时出现一些问题

  • 您正在将多个项目添加到单元中,但没有在图像视图上定义任何自动布局约束,因此它不知道如何正确放置/堆叠项目
  • 从上面的代码中,您添加的UIImageView的帧为CGRectZero,如果没有autulayout规则,它们将在添加图像时保持为零或尝试调整为contentsize,但它们不会调整单元格高度
  • 如果要从网络加载图像,则可能会在tableviewcell完成初始渲染后添加/渲染图像。因此,您可能需要缓存加载的图像并重新加载单元格,以便它们能够在正确的时间加载
  • 最后一点要复杂得多

    Dynamic UITableViewCell根据其中内容的自动布局规则计算其高度。从内容到UITableViewCell的contentView属性(到所有边),必须有足够的约束,这些约束为单元格提供足够的信息,以便放置每个项目、计算其总体高度和宽度,从而计算新高度

    对于动态大小的单元格,仅使用一个图像并不太坏。但是,在单元格最初呈现之后,在没有任何规则的情况下动态放置多个项目将不起作用

    你需要决定这些图像应该如何在你的细胞中布局。完成此操作后,可以在添加图像视图时查看添加所需的约束。就我个人而言,我只会在收到每个图像后添加图像视图

    在此之前,当我完成此操作时,我缓存了接收到的图像,并重新加载了单元格,以便图像可以在渲染时放置在单元格中,从而允许tableview单元格根据图像尺寸和约束计算其高度

    您可能还想考虑使用集合视图或将图像合并为单个图像并在单元格中使用该图像。您可以在运行时或服务器端在设备上执行此操作,前提是您可以访问映像

    override var intrinsicContentSize {
        let frameWidth = self.frame.size.width
        var frameHeight: CGFloat
        switch self.imageUrls.count { // range from 1...9
        case 1...3:
            frameHeight = frameWidth / 3
        case 4...6:
            frameHeight = frameWidth / 3 * 2
        default:
            frameHeight = frameWidth
        return CGSize(frameWidth, frameHeight)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        self.imageViews.forEach { imageView in
            imageView.frame = // Calculate position for each subview
        }
    }