到目前为止,我只是在单元格中使用文本标签,可以自动调整大小.我通常会对所有边(内容视图或邻居)设置约束,并在我的viewDidLoad()行中添加以下行:

// 190.0 is the actual height of my custom cell (see next image) in the storyboard containing a label and a randomly sized UIImageView
tableView.estimatedRowHeight = 190.0
tableView.rowHeight = UITableViewAutomaticDimension

现在,当我try 在图片中加入时,我面临几个问题.在一些研究中,我发现了几种用Objective-C编写的方法,但我不确定哪种方法真正解决了我的核心问题,我仍在为复杂的Objective-C代码而挣扎.所以要继续:我的最终目标是得到一个具有正确大小(正确高度)单元格的表格,每个单元格都包含一个标题和一个适合屏幕宽度的图像.这些图像可以具有不同的纵横比和大小.为了简化一些挑战,我准备了一个新的、更简单的项目:

  1. 首先,我创建了一个UITableViewController和一个CustomCell类,其中有两个IBtitle: StringpostedImage: UIImage(在故事板中随机设置UIImage大小)来配置单元.我定义了对边和彼此的约束.

  1. 构建时,两个单元被配置为包含相同的图像,但它们是从两个大小和分辨率不同的单独文件中获取的(900 x 171与一半大小的450 x 86).UIImage视图模式被设置为"Aspect Fit",但由于目前无法按我想要的方式运行,我不确定这是正确的设置.虽然我希望单元格高度是基于重新zoom 的UIImage(包括我设置的约束)计算的,但它似乎是基于图像文件的初始高度(so 171和86).它实际上并不适应实际的UIImage视图高度(我猜大约70).

两个单元格高度都基于初始图像文件高度,而不是实际的UIImage高度

在我的一个比较复杂的项目中,我希望不同的图像能够自动适应屏幕的宽度,无论它们是纵向的还是横向的——如果它们的宽度小于屏幕的宽度,它们应该被放大.就像在项目中一样,每个单元格的高度都应该符合故事板中约束定义的单个内容.无论如何,它从上面讨论的问题开始:我怎样才能让这两个单元格具有相同的、正确的高度,像故事板中定义的那样拥抱它的内容?

非常感谢你的帮助!

推荐答案

所以我认为根本的问题是一种鸡和蛋的问题.

为了将图像"纵横向匹配"到UIImageView,系统需要一个视图尺寸,但我们希望在给定已知视图宽度的情况下,将视图的高度确定为after纵横向匹配图像.

一种解决方法是自己计算图像的纵横比,并在设置图像时将其设置为UIImageView的约束条件.这样,自动布局系统就有足够的信息来调整视图的大小(宽度和纵横比).

所以我将您的自定义单元格类更改为:

class CustomCell: UITableViewCell {

    @IBOutlet weak var imageTitle: UILabel!

    @IBOutlet weak var postedImageView: UIImageView!

    internal var aspectConstraint : NSLayoutConstraint? {
        didSet {
            if oldValue != nil {
                postedImageView.removeConstraint(oldValue!)
            }
            if aspectConstraint != nil {
                postedImageView.addConstraint(aspectConstraint!)
            }
        }
    }

    override func prepareForReuse() {
        super.prepareForReuse()
        aspectConstraint = nil
    }

    func setPostedImage(image : UIImage) {

        let aspect = image.size.width / image.size.height

        aspectConstraint = NSLayoutConstraint(item: postedImageView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: postedImageView, attribute: NSLayoutAttribute.Height, multiplier: aspect, constant: 0.0)

        postedImageView.image = image
    }

}

然后在代理中执行此操作,而不是直接设置图像:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as CustomCell

        cell.imageTitle.text = titles[indexPath.row]

        let image = images[titles[indexPath.row]]!
        cell.setPostedImage(image)

        return cell
}

你会得到:

在此处输入图像描述

希望这有帮助!

Swift相关问答推荐

如何在SWIFT中解码Instagram Backup中的字符串?

在SWIFT中使用Objective-C struct 时出错(在作用域中找不到类型)

为什么ClosedRange<;Int&>包含的速度比预期慢340万倍?

同时具有每个文本的标识符的文本组的可扩展性标识符

解码器是否需要具有密钥的外部数据表示?

SwiftUI,如何更改具有多个按钮和一个布尔条件的一个按钮标签

如何使用可搜索在搜索栏中搜索包括>或<?

RealityKit - 从中心zoom 模型

在Equatable上引用运算符函数==要求Dictionary.Values符合Equatable

PassthroughSubject 的 AsyncPublisher 值属性未生成所有值

macOS 的窗口框架中使用的真实类型和真实类型是什么?

覆盖一个子元素的 HStack 对齐方式

TextField 键入未完成

MainActor 隔离可变存储属性为何会出现可发送错误?

SwiftUI:异步网络请求后@State 值不更新

SwiftUI 视图的默认成员初始化器 VS 自定义初始化器

RxSwift:share() 替代方案,保证upstream 的单一订阅

在视图中设置所有变量

当我必须在 Swift 中的类、 struct 和枚举之间进行 Select 时,我应该如何推理?

在这个例子中美元符号有什么作用?