从单元格中删除图像并显示新的单元格高度的问题

时间:2019-06-13 19:39:50

标签: image tableview swift4

我根据标签和图像制作了具有动态单元格高度的表格视图。我有两个问题: 1.如何像在“单元格”类中的注释中看到的那样,以编程方式设置标签和图像的大小?我尝试了CGRect,但正如我所见,我需要设置高度值,但我不知道这样做,因为我的标签应该具有动态高度。 2.如果她有nil值,我想删除图像表格单元格,然后使单元格高度仅取决于标签。

在此代码中,我使用情节提要板制作了标签和图像的大小。我认为我可以使用if语句解决此问题,其中如果图像为nil,我可以设置标签的底部空间。

这是我的代码:

class Cell: UITableViewCell {

    @IBOutlet weak var picImage : UIImageView!
    @IBOutlet weak var descLabel : UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        descLabel?.numberOfLines = 0
        //set label size programmaticly, like (leading space to 40, top 20, trailling space to 40)
        //set image size programmaticly, like (Horizontally center, top 10 under descLabel, width 50, height 90)
    }


}
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var table: UITableView!
    var arrOfPictures : [String?] = ["str", "", "str"]
    var arrOfDesText : [String] = ["sometext sometext sometext some text sometext sometext sometext some text sometext sometext sometext some text sometext sometext sometext some text", "sometext sometext sometext some text sometext sometext sometext some text sometext sometext sometext some text sometext sometext sometext some text", "sometext sometext sometext some text sometext sometext sometext some text sometext sometext sometext some text sometext sometext sometext some text"]

    override func viewDidLoad() {
        super.viewDidLoad()
        table.estimatedRowHeight = 70
        table.rowHeight = UITableView.automaticDimension
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! Cell
        cell.descLabel!.text = arrOfDesText[indexPath.row]
        cell.picImage!.image = UIImage(named: arrOfPictures[indexPath.row]!)
        return cell
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableView.automaticDimension
    }
}

这是它的样子: my image

因此您可以看到第二个单元格不显示图像,但是该单元格的高度仍然与其他单元格相同,这就是我要更改的地方。

2 个答案:

答案 0 :(得分:0)

您可以在heightForRowAt indexPath委托方法中为单元格设置高度。检查条件,在特定索引路径的数组中不为空,返回autoDimension否则估计行高

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

                let pic = arrOfPictures[indexPath.row]
                    if !pic.isEmpty {
                        return UITableView.automaticDimension  
                    }else{

                        return 70
                    }
       }

答案 1 :(得分:0)

已解决

以下是代码和图片:

class Cell: UITableViewCell {

@IBOutlet weak var picImage : UIImageView!
@IBOutlet weak var descLabel : UILabel!

override func awakeFromNib() {
    super.awakeFromNib()

descLabel.numberOfLines = 0
contentView.addSubview(descLabel)
descLabel.translatesAutoresizingMaskIntoConstraints = false
descLabel.topAnchor.constraint(equalTo: contentView.safeAreaLayoutGuide.topAnchor, constant: 10).isActive = true
descLabel.leadingAnchor.constraint(equalTo: contentView.safeAreaLayoutGuide.leadingAnchor, constant: 35).isActive = true
descLabel.trailingAnchor.constraint(equalTo: contentView.safeAreaLayoutGuide.trailingAnchor, constant: -35).isActive = true

contentView.addSubview(picImage)
picImage.translatesAutoresizingMaskIntoConstraints = false
picImage.leadingAnchor.constraint(equalTo: contentView.safeAreaLayoutGuide.leadingAnchor, constant: 10).isActive = true
picImage.bottomAnchor.constraint(equalTo: contentView.safeAreaLayoutGuide.bottomAnchor, constant: -10).isActive = true
picImage.trailingAnchor.constraint(equalTo: contentView.safeAreaLayoutGuide.trailingAnchor, constant: -10).isActive = true
picImage.topAnchor.constraint(equalTo: descLabel.safeAreaLayoutGuide.bottomAnchor, constant: 10).isActive = true


}


} 

和控制器类

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

let loading = UIActivityIndicatorView(style: .gray)
@IBOutlet weak var table: UITableView!
var arrOfPictures : [String?] = ["str", "", "str"]
var arrOfDesText : [String] = ["sometext sometext sometext some text sometext sometext sometext some text sometext sometext sometext some text sometext sometext sometext some text", "sometext sometext sometext some text sometext sometext sometext some text sometext sometext sometext some text sometext sometext sometext some text", "sometext sometext sometext some text sometext sometext sometext some text sometext sometext sometext some text sometext sometext sometext some text", "sometext sometext sometext some text sometext sometext sometext some text sometext sometext sometext some text sometext sometext sometext some text", "sometext sometext sometext some text sometext sometext sometext some text sometext sometext sometext some text sometext sometext sometext some text"]

override func viewDidLoad() {
    super.viewDidLoad()
    table.estimatedRowHeight = 70
    table.rowHeight = UITableView.automaticDimension
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return arrOfDesText.count
}
var index = 0
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! Cell
    cell.descLabel!.text = arrOfDesText[indexPath.row]
    if index < arrOfPictures.count {
        index += 1
        cell.picImage.image = UIImage(named: (arrOfPictures[indexPath.row]!))
    }
    return cell
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableView.automaticDimension
}
}