@Neckvik

Как отловить изменения динамической строки в таблице в SWIFT?

5d0e28ad778c2207278864.png Проблема такова, у меня размер строки определяется автоматически, в зависимости от экрана. Проблема заключается в том что когда func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)
прогружает строки таблицы, дает размеры не верно. Я беру высоту строки, что бы сделать картинку круглой, и он берется не верный размер (например который был в сторибор дефолтный), она берет меньше чем будет, тк еще не произошло автоматическое изменение размера.
Тк он поменяет на правильный размер строки только при отрисовки, то есть после того как я верну из этого метода строку.
У меня соотвественно картинка будет закругляться не верно (картинку я закругляю верно, просто мне размер дается не верный)
Как я могу узнать какой размер будет у строки таблицы до того как я верну из метода эту строку?
Или как можно отловить изменение размера строки через табличку или через функции строки.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "chat") as! ChatsTableViewCell;
        cell.imageUser.image = UIImage.convertBase64ToImage(imageString: (data?.list[indexPath.row].imageUser)!)
        cell.imageUser.layer.cornerRadius =  cell.frame.size.height / 2;
        cell.imageChat.clipsToBounds = true;
        return cell;
    }
  • Вопрос задан
  • 321 просмотр
Пригласить эксперта
Ответы на вопрос 2
doublench21
@doublench21 Куратор тега Swift
Этот код абсолютно ужасен.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "chat") as! ChatsTableViewCell;
        cell.imageUser.image = UIImage.convertBase64ToImage(imageString: (data?.list[indexPath.row].imageUser)!)
        cell.imageUser.layer.cornerRadius =  cell.frame.size.height / 2;
        cell.imageUser.clipsToBounds = true;
        return cell;
}


Во-первых, не нужно делать каждый раз то, что можно и нужно сделать один раз.
Во-вторых, вы ведь всегда можете отследить изменения размеров, просто переопределив соответсвующее св-во.
(Если у вас ячейка определена в сториборде, то первые два метода можно удалить и записать всё в методе awakeFromNib)
Ещё внутри предопределенного св-ва я написал функцию printf. Посмотрите, сколько раз вызывается эта функция и сравните с тем, сколько раз будет вызываться ваш код в
tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)


5d0f6aaef237c045355418.png

Код
import UIKit

final class Cell: UITableViewCell {

  override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    imageView?.clipsToBounds = true
    imageView?.contentMode = .scaleAspectFit
  }

  required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

  override var frame: CGRect {
    didSet {
      guard frame.height != oldValue.height else { return }
      imageView?.layer.cornerRadius = frame.height / 2.0
      print(#function)
    }
  }
}

final class TableViewController: UITableViewController {

  override func viewDidLoad() {
    super.viewDidLoad()


    tableView.register(Cell.self, forCellReuseIdentifier: "Cell")
  }

  override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 21;
  }

  override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    cell.imageView?.image = UIImage(named: "c-1-8")!
    cell.textLabel?.text = "Ooops";
    return cell;
  }

  override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return tableView.frame.width * 0.25;
  }
}



5d0f6c640a520243262603.png

P.S. Надеюсь я Вас правильно понял.
Ответ написан
briahas
@briahas
ObjC, Swift, Python
Мне не понятно - зачем привязывать радиус скругления картинки к высоте ячейки если нужна круглая картинка??? Тогда уж - высоту ячейки надо привязывать к высоте картинки. А у вас все на оборот - воз впереди лошади едет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы