- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在对问题的解释之后是代码。
我有一个包含 UITableView
的 UIViewController
,其中的 UITableViewCell
显示一个、两个或零个图像。对于一张和两张图像,单元格的高度始终为 72,但如果没有任何图像,它需要为零。我的表格单元格中有两个 UIView
,第一个包含一个 UIImageView
,第二个包含两个。我是隐藏还是显示相关的,具体取决于该单元格是否有一张或两张图像。如果单元格有零个图像,两个 UIView
都被隐藏,但当然它们仍然构成约束设置的一部分,因此生成的单元格仍然是 72 像素高,而我需要它折叠.
有人告诉我,唯一创建可调整高度的 UITableViewCell
的方法是在 Storyboard 中设置约束,并且弄乱约束的值以编程方式即时会导致布局问题。我不知道这些建议是否属实,所以我尝试了以下方法(但没有成功):
在我的 ResizableImageCell
调用中设置对我的 UIView
的控制高度的 NSLayoutConstraint
的显式引用,这导致 Unable simultaneously satisfy constraints
错误;和
在我的 ResizableImageCell
调用中设置对控制高度的 all NSLayoutConstraint
的显式引用;和/或
添加和删除 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的屏幕截图:
感谢阅读。
最佳答案
我在项目中使用 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/
我是一名优秀的程序员,十分优秀!