Проблема с удалением изображения из ячейки и отображением новой высоты ячейки - PullRequest
1 голос
/ 13 июня 2019

Я сделал просмотр таблицы с динамической высотой ячейки в зависимости от метки и изображения.У меня два вопроса: 1. Как программно установить размер для метки и изображения, как вы можете видеть в комментариях внутри класса «Ячейка»?Я пытался с CGRect, но, как я вижу, мне нужно установить значение высоты, что я не знаю, чтобы сделать это, так как мой ярлык должен иметь динамическую высоту.2. Я хотел бы удалить ячейку формы изображения, если она имеет значение nil, а затем сделать высоту ячейки в зависимости только от метки.

В этом коде я сделал размер метки и изображения, используя раскадровку.Я думаю, что смогу решить эту проблему, используя оператор if, в котором я установил нижнее пространство для метки, если изображение равно нулю.

Вот мой код:

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 голосов
/ 14 июня 2019

решаемые

Вот код и изображение:

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
}
}
0 голосов
/ 14 июня 2019

Вы можете установить высоту для ячейки в heightForRowAt indexPath методе делегата. Проверьте условие, в массиве по указанному индексу путь не пустой, верните automaticDimension, иначе оцените высоту строк

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

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

                        return 70
                    }
       }
...