gpt4 book ai didi

uitableview - 自动布局 : Get UIImageView height to calculate cell height correctly

转载 作者:IT王子 更新时间:2023-10-29 05:02:08 24 4
gpt4 key购买 nike

到目前为止,我一直只在单元格内使用文本标签,这些标签应该自动调整自己的大小。我通常对所有边缘(内容 View 或邻居)施加约束,并将以下行添加到我的 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

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

  1. 首先,我创建了一个 UITableViewController 和一个带有两个 IBOutlets title: StringpostedImage: UIImageCustomCell 类>(UIImage 在 Storyboard 中随机调整大小)来配置单元格。我定义了对边缘和彼此的约束。

  1. 构建时,两个单元格被配置为包含相同的图像,但它们是从两个具有不同大小和分辨率(900 x 171 与半尺寸 450 x 86)的单独文件中提取的。 UIImage View 模式设置为“Aspect Fit”,但由于我无法让它按照我想要的方式运行,所以我不确定这是正确的设置。虽然我曾期望根据重新缩放的 UIImage 计算单元格高度,包括我设置的约束,但它似乎是基于图像文件的初始高度(所以 171 和 86)。它实际上并不适应实际的 UIImage View 高度(我猜大约是 70)。

Both cell heights are based on the initial image file height and not on the actual UIImage height

在我的一个稍微复杂的项目中,我希望不同的图像能够自动适应屏幕的宽度,无论它们是纵向的还是横向的 - 如果它们的宽度小于屏幕的宽度,它们应该按比例放大。就像在上面的项目中一样,每个单元格高度都应该符合 Storyboard 中的约束所定义的各个内容。无论如何,它从上面讨论的问题开始:如何让这两个单元格具有相同、正确的高度,并像 Storyboard 中定义的那样包含其内容?

感谢一百万的帮助!

最佳答案

所以我认为潜在的问题是先有鸡还是先有蛋的问题。

为了使图像“纵横比”适合 UIImageView系统需要 View 的大小,但我们希望在已知 View 宽度的情况下对图像进行纵横比拟合后确定 View 的高度。

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

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

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
}

}

然后在委托(delegate)中执行此操作而不是直接设置图像:

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
}

你会得到:

enter image description here

希望这对您有所帮助!

关于uitableview - 自动布局 : Get UIImageView height to calculate cell height correctly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26041820/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com