在我的应用中,我有一个UITableViewCell
,可以包含任意UIView
(或其子类)。我希望视图适合UITableViewCell
contentView
的边距。细胞高度将根据我的需要进行调整。
我尝试了各种各样的事情,但没有取得积极成果。
这是代码。这是行不通的。 :(
它不适合边距,内容比屏幕尺寸宽。
怎么办?
class CustomView: UIStackView {
class func viewFromNib() -> CustomView {
guard let view = NSBundle(forClass: CustomView.self).loadNibNamed("CustomView", owner: nil, options: nil).first as? CustomView else {fatalError("CustomView not found")}
return view
}
}
class ViewController: UITableViewController {
let customView = CustomView.viewFromNib()
var containerCell: ContainerTableViewCell?
override func viewDidLoad() {
super.viewDidLoad()
containerCell = ContainerTableViewCell.cell(customView, height: nil)
tableView.reloadData()
tableView.estimatedRowHeight = 40
tableView.rowHeight = UITableViewAutomaticDimension
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
return containerCell ?? UITableViewCell()
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
}
class ContainerTableViewCell: UITableViewCell {
var singleView: UIView?
class func cell(view: UIView, height: CGFloat?) -> ContainerTableViewCell {
let cell = ContainerTableViewCell()
cell.setup(view, height: height)
return cell
}
func setup(view: UIView, height: CGFloat?) {
singleView = view
contentView.addSubview(singleView!)
let margins = contentView.layoutMarginsGuide
singleView?.topAnchor.constraintEqualToAnchor(margins.topAnchor).active = true
singleView?.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor).active = true
singleView?.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor).active = true
singleView?.bottomAnchor.constraintEqualToAnchor(margins.bottomAnchor).active = true
setNeedsLayout()
if let height = height {
contentView.heightAnchor.constraintEqualToConstant(height).active = true
}
}
}
答案 0 :(得分:0)
你应该实施
optional func tableView(_ tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
在viewController
中,并在刷新表格时了解每个单元格的高度。
答案 1 :(得分:0)
cellForRowAtIndexPath
必须使用dequeue
系列方法获取您的表格单元格实例:
这样对象将通过其常规构造函数创建,不您的工厂方法。你没有这种灵活性。
因此,在您的子类中,将通用约束放在awakeFromNib
或重写的构造函数中。不要忘记考虑干扰程序性约束的自动调整大小掩码,因此必须将此字段设置为false
:
最后,在cellForRowAtIndexPath
中,您可以修改dequeue调用返回的UITableViewCell
实例的约束,以获得自定义高度。