添加子视图后,Swift Playground UITable视图单元格未调整大小

时间:2018-07-24 22:21:02

标签: ios swift uitableview programmatically row-height

the table view loads

the sub view loads but you can see it is over other cells

sometimes the sub view loads but other cells are on top of it

我有一个UITableView,当用户触摸一行时,一个子视图被添加到屏幕上。当他们单击另一行时,最后一个子视图消失(该行应缩小到其正常大小)。子视图显示完美(当单击另一行时消失),但该子视图挂出该行并涵盖了其他一些选项。另外,在旋转屏幕后重新加载表格视图时,子视图最终会在表格的其他行后面结束。

我希望调整带有子视图的行的大小,使其与子视图的框架匹配。而且,每个子视图的大小都不同,具体取决于其中包含的文本和图像。因此,我尝试使用自动布局和UITableViewAutomaticDimension,但似乎没有任何效果。

我包括了UITableViewController,因此您可以看到我拥有的东西,并可以将我引导到正确的方向。

class TableViewController : UITableViewController {

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    tableView.backgroundColor = #colorLiteral(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0)
    self.tableView.estimatedRowHeight = rowHeight
    return filmsToDisplay.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    var currentFilm = filmsToDisplay[indexPath.row]
    let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
    cell.selectionStyle = .none
    cell.textLabel?.text = "\(currentFilm.year) - \(currentFilm.movieTitle)"
    cell.textLabel?.textColor = #colorLiteral(red: 0.254901975393295, green: 0.274509817361832, blue: 0.301960796117783, alpha: 1.0)
    cell.textLabel?.font = UIFont.systemFont(ofSize: fontSize)
    cell.textLabel?.sizeToFit()
    cell.backgroundColor = #colorLiteral(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0)
    cell.contentView.backgroundColor = #colorLiteral(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0)



    let accessory = makeChart(currentFilm: filmsToDisplay[indexPath.row])
    cell.contentView.addSubview(accessory)
    accessory.translatesAutoresizingMaskIntoConstraints = false
    accessory.trailingAnchor.constraint(equalTo:cell.contentView.trailingAnchor).isActive = true
    accessory.topAnchor.constraint(equalTo: cell.contentView.topAnchor).isActive = true
    accessory.bottomAnchor.constraint(equalTo: cell.contentView.bottomAnchor).isActive = true
    accessory.widthAnchor.constraint(equalTo: cell.contentView.widthAnchor, multiplier: nomBarWidth).isActive = true

    cell.contentView.translatesAutoresizingMaskIntoConstraints=false
    cell.contentView.leadingAnchor.constraint(equalTo:cell.leadingAnchor).isActive = true
    cell.contentView.trailingAnchor.constraint(equalTo:cell.trailingAnchor).isActive = true
    cell.contentView.topAnchor.constraint(equalTo:cell.topAnchor).isActive = true
    cell.contentView.bottomAnchor.constraint(equalTo: cell.bottomAnchor).isActive = true

    return cell
}

var lastSelectedCell : UITableViewCell? = nil
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let currentFilm = filmsToDisplay[indexPath.row]
    var detailView = createView(film: currentFilm)
    detailView.tag = 555
    let selectedCell:UITableViewCell = tableView.cellForRow(at: indexPath)!
    //get rid of last detail view
    if let lastCell = lastSelectedCell {
        for i in 0..<lastCell.contentView.subviews.count {
            let content = lastCell.contentView.subviews[i]
            if content.tag == 555{
                content.removeFromSuperview()
            }
        }
    }
    selectedCell.contentView.addSubview(detailView)
    detailView.translatesAutoresizingMaskIntoConstraints=false
    detailView.leadingAnchor.constraint(equalTo:selectedCell.contentView.leadingAnchor).isActive = true
    detailView.trailingAnchor.constraint(equalTo:selectedCell.contentView.trailingAnchor).isActive = true
    detailView.topAnchor.constraint(equalTo:selectedCell.contentView.topAnchor).isActive = true
    detailView.bottomAnchor.constraint(equalTo:detailView.subviews[detailView.subviews.count - 2].bottomAnchor).isActive = true
    lastSelectedCell = selectedCell
}

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

}

子视图的各个部分按以下方式定义其高度(有更多的部分,但它们都具有相同的约束类型:

//MOVIE TITLE BAR
let movieTitleBar = UIButton()
movieTitleBar.setTitleColor(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0), for: UIControlState.normal)
movieTitleBar.setTitle(film.movieTitle, for: UIControlState.normal)
    movieTitleBar.backgroundColor = #colorLiteral(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0)
    movieTitleBar.alpha = 0.5
    movieTitleBar.layer.borderWidth = outlineWidth
    movieTitleBar.layer.borderColor = #colorLiteral(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0)
}
filmView.addSubview(movieTitleBar)
movieTitleBar.translatesAutoresizingMaskIntoConstraints = false
movieTitleBar.topAnchor.constraint(equalTo:filmView.topAnchor).isActive = true
movieTitleBar.heightAnchor.constraint(equalToConstant: rowHeight).isActive = true
movieTitleBar.leadingAnchor.constraint(equalTo:filmView.leadingAnchor).isActive = true
movieTitleBar.trailingAnchor.constraint(equalTo:filmView.trailingAnchor).isActive = true

//POSTER IMAGE
var poster = UIButton()
isPoster = false
if let posterImg = film.image {
    if let url = NSURL(string:posterImg){
        if let data = NSData(contentsOf:url as URL){
            film.poster = UIImage(data:data as Data)
            poster.setImage(film.poster, for: UIControlState.normal)
            isPoster = true
            filmView.addSubview(poster)
        }
    }
}

//BRIEF DESCRIPTION LABEL
let briefDescriptionBar = UILabel()
briefDescriptionBar.backgroundColor = film.colorUI
briefDescriptionBar.alpha = 0.8
briefDescriptionBar.text = "\(film.year) - \(film.briefDescription)"
briefDescriptionBar.textColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
briefDescriptionBar.numberOfLines = 0
briefDescriptionBar.textAlignment = .center
filmView.addSubview(briefDescriptionBar)
briefDescriptionBar.translatesAutoresizingMaskIntoConstraints = false
briefDescriptionBar.leadingAnchor.constraint(equalTo:movieTitleBar.leadingAnchor).isActive = true
briefDescriptionBar.topAnchor.constraint(equalTo:movieTitleBar.bottomAnchor).isActive = true
if isPoster == true {
    poster.translatesAutoresizingMaskIntoConstraints = false
    poster.topAnchor.constraint(equalTo:movieTitleBar.bottomAnchor).isActive = true
    poster.trailingAnchor.constraint(equalTo:movieTitleBar.trailingAnchor).isActive = true
    poster.widthAnchor.constraint(equalTo:filmView.widthAnchor, multiplier:nomBarWidth).isActive = true
    let aspect = (nomBarWidth * 41) / 27
    poster.heightAnchor.constraint(equalTo: filmView.widthAnchor, multiplier: aspect).isActive = true
    briefDescriptionBar.trailingAnchor.constraint(equalTo:poster.leadingAnchor).isActive = true
    briefDescriptionBar.bottomAnchor.constraint(equalTo:poster.bottomAnchor).isActive = true
}
else {
    briefDescriptionBar.widthAnchor.constraint(equalTo:filmView.widthAnchor).isActive = true
    briefDescriptionBar.heightAnchor.constraint(equalTo:movieTitleBar.heightAnchor, multiplier : 2).isActive = true
}

1 个答案:

答案 0 :(得分:0)

您的问题是您没有为添加的子视图提供高度限制,您只钩住领先,trailing,顶部和底部,但是contentView期望它是内部子视图的高度(如果它们没有固有的内容大小例如标签/按钮),也不需要这部分代码

cell.contentView.translatesAutoresizingMaskIntoConstraints=false
cell.contentView.leadingAnchor.constraint(equalTo:cell.leadingAnchor).isActive = true
cell.contentView.trailingAnchor.constraint(equalTo:cell.trailingAnchor).isActive = true
cell.contentView.topAnchor.constraint(equalTo:cell.topAnchor).isActive = true
cell.contentView.bottomAnchor.constraint(equalTo: cell.bottomAnchor).isActive = true

此外,contentView内部应该只有一个视图连接到底部,如果添加多个视图,则如果两个视图也都钩在顶部,则会产生冲突,因此必须中断钩上新视图之前的最后一个视图底部约束

相关问题