gpt4 book ai didi

ios - 如何为具有 0 到 2 个图像的 UITableViewCells 设置可调整高度的约束?

转载 作者:行者123 更新时间:2023-11-28 06:27:19 26 4
gpt4 key购买 nike

在对问题的解释之后是代码。

我有一个包含 UITableViewUIViewController,其中的 UITableViewCell 显示一个、两个或零个图像。对于一张和两张图像,单元格的高度始终为 72,但如果没有任何图像,它需要为零。我的表格单元格中有两个 UIView,第一个包含一个 UIImageView,第二个包含两个。我是隐藏还是显示相关的,具体取决于该单元格是否有一张或两张图像。如果单元格有零个图像,两个 UIView 都被隐藏,但当然它们仍然构成约束设置的一部分,因此生成的单元格仍然是 72 像素高,而我需要它折叠.

有人告诉我,唯一创建可调整高度的 UITableViewCell 的方法是在 Storyboard 中设置约束,并且弄乱约束的值以编程方式即时会导致布局问题。我不知道这些建议是否属实,所以我尝试了以下方法(但没有成功):

  1. 在我的 ResizableImageCell 调用中设置对我的 UIView 的控制高度的 NSLayoutConstraint 的显式引用,这导致 Unable simultaneously satisfy constraints 错误;和

  2. 在我的 ResizableImageCell 调用中设置对控制高度的 all NSLayoutConstraint 的显式引用;和/或

  3. 添加和删除 UIView,这两者都可以正常工作,直到您开始滚动表格,然后当您将手指从屏幕上移开后表格开始上下跳动。

这是控制 ViewController 的当前代码:

import UIKit

class ViewController: UIViewController
{
@IBOutlet weak var tableView: UITableView!

let imageNames = [ "room", "street", "tree" ]



override func viewDidLoad ()
{
super.viewDidLoad()

tableView.delegate = self
tableView.dataSource = self
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 44.0
}



func getRandomInt ( from start: Int, to end: Int ) -> Int
{
return Int( arc4random_uniform( UInt32( ( end + 1 ) - start ) ) ) + start
}
}



extension ViewController: UITableViewDataSource
{
@available( iOS 2.0, * )
public func tableView ( _ tableView: UITableView, cellForRowAt indexPath: IndexPath ) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell( withIdentifier: "ResizableImageCell" ) as! ResizableImageCell
let numImages = getRandomInt( from: 0, to: 2 )

cell.view1.isHidden = numImages != 1
cell.view2.isHidden = numImages != 2

var rand = getRandomInt( from: 0, to: imageNames.count - 1 )

switch numImages
{
case 1: cell.image1.image = UIImage( named: imageNames[ rand ] )
case 2: cell.image2.image = UIImage( named: imageNames[ rand ] )
default: ()
}

guard numImages == 2 else { return cell }

rand = getRandomInt( from: 0, to: imageNames.count - 1 )

cell.image3.image = UIImage( named: imageNames[ rand ] )

return cell
}



func tableView ( _ tableView: UITableView, numberOfRowsInSection section: Int ) -> Int
{
return 64
}
}

这是控制我定制的 ResizableImageCell 单元格的当前代码

import UIKit

class ResizableImageCell: UITableViewCell
{
@IBOutlet weak var view1: UIView!
@IBOutlet weak var view2: UIView!

@IBOutlet weak var image1: UIImageView!
@IBOutlet weak var image2: UIImageView!
@IBOutlet weak var image3: UIImageView!



override func awakeFromNib ()
{
super.awakeFromNib()
}
}

这是现有 Storyboard的屏幕截图:

screenshot of a storyboard from XCode

感谢阅读。

最佳答案

我在项目中使用 heighForRow 函数解决了这个问题。

在 View Controller 中:

 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

//Check if you have to display images or not

//return 75 or CGFloat.ulpOfOne
}

也许使用此解决方案,您必须在 cellForRowAtIndexPath 函数之前设置 let numImages = getRandomInt( from: 0, to: 2 ) 并将 64 个结果存储在一个数组。

编辑:来自 Josh Homann 的重要说明:

Do not return 0 for the height or you may get some auto layout errors in the console because your rect is degenerate. return CGFloat.ulpOfOne which is infinitesimally small but still non zero.

关于ios - 如何为具有 0 到 2 个图像的 UITableViewCells 设置可调整高度的约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41505470/

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