在UITableviewCell中布置动态子视图,限制边距

时间:2016-08-23 18:50:35

标签: ios swift uitableview

在我的应用中,我有一个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
        }
    }
}

2 个答案:

答案 0 :(得分:0)

你应该实施

optional func tableView(_ tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat

viewController中,并在刷新表格时了解每个单元格的高度。

答案 1 :(得分:0)

cellForRowAtIndexPath 必须使用dequeue系列方法获取您的表格单元格实例:

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableView_Class/#//apple_ref/occ/instm/UITableView/dequeueReusableCellWithIdentifier:forIndexPath

这样对象将通过其常规构造函数创建,您的工厂方法。你没有这种灵活性。

因此,在您的子类中,将通用约束放在awakeFromNib或重写的构造函数中。不要忘记考虑干扰程序性约束的自动调整大小掩码,因此必须将此字段设置为false

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instp/UIView/translatesAutoresizingMaskIntoConstraints

最后,在cellForRowAtIndexPath中,您可以修改dequeue调用返回的UITableViewCell实例的约束,以获得自定义高度。

祝你好运!