Получение tableView rowHeight в пользовательской ячейке (программно) - PullRequest
0 голосов
/ 25 мая 2020

Мне очень трудно установить связь между моей пользовательской ячейкой (TicketCell.swift) и контроллером табличного представления (MarketTableViewController.swift). Итак, в мою таблицу импортируется около 40 ячеек, и я хочу разместить кнопку с правой стороны каждой ячейки

Вот мой код для моей кнопки внутри TicketCell:

lazy var purchaseButton : UIButton = {
  let button = UIButton(frame: CGRect(x: self.bounds.width - 30, y: self.bounds.height/2, width: 64, height: 24))
  button.addTarget(self, action: #selector(purchaseButtonTapped), for: .touchUpInside)
  button.layer.cornerRadius = 4
  button.layer.borderColor = UIColor.blue.cgColor
  button.layer.borderWidth = 1
  button.setTitleColor(.black, for: .normal)
  return button
}()

но, как вы можете видеть здесь, он не центрируется так, как я хочу: enter image description here enter image description here

Я хочу, чтобы он всегда был справа, независимо от ориентации телефона, а также по центру ячейки по вертикали.

В MarketTableViewControleler я установил высоту каждой ячейки следующим образом:

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

не может получить доступ к этой переменной высоты из моей пользовательской ячейки, я пробовал все следующее:

contentView.frame.height
contentView.bounds.height
self.bounds.height
Constants.ViewControllers.marketTableViewController.tableView.frame.height
Constants.ViewController.marketTableViewController.tableView.rowHeight

Я даже пытался использовать делегата для передачи tableView в пользовательскую ячейку, но он просто дает мне та же информация, что и я получаю из моего класса констант. Пожалуйста, помогите!

Ответы [ 2 ]

1 голос
/ 05 июня 2020

Вы определенно можете решить это с помощью ограничений. Установка ограничения .right по отношению к супервизору и ограничения .left по отношению к контенту, который вы хотите отобразить с левой стороны, должна работать. Чтобы центрировать кнопку, вы можете использовать ограничение .centerY, равное супервизору.

Но установка ограничений повсюду, для всех ваших подпредставлений может стать немного сложнее управлять позже, особенно когда вы начинаете обрабатывать изменения ориентации и т. Д. c. Я бы посоветовал также изучить UIStackView. Вы можете легко использовать горизонтальное представление стека для реализации этого типа настраиваемого представления. Вы можете установить distribution в соответствии с вашими требованиями, а установка alignment на .center будет вертикально центрировать кнопку в вашей ячейке.

Вы можете проверить эту статью. Это похоже на то, что вы, возможно, пытаетесь реализовать.

0 голосов
/ 25 мая 2020

Вам нужно ограничить ваши подвиды, чтобы сохранить макет при изменении ориентации. Вот как это сделать:

class TicketCell: UITableViewCell {
    lazy var purchaseButton : UIButton = {
      let button = UIButton(frame: CGRect(x: self.bounds.width - 30, y: self.bounds.height/2, width: 64, height: 24))
      button.addTarget(self, action: #selector(purchaseButtonTapped), for: .touchUpInside)
      button.layer.cornerRadius = 4
      button.layer.borderColor = UIColor.blue.cgColor
      button.layer.borderWidth = 1
      button.setTitleColor(.black, for: .normal)
      return button
    }()

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

        addSubview(purchaseButton)

        purchaseButton.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activate([
            purchaseButton.topAnchor.constraint(equalTo: topAnchor, constant: 16),
            purchaseButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16)])
    }

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

Примечание: здесь я ограничиваю purchaseButton до TicketCell, чтобы он имел отступ 16 от верхнего и правого углов, вы можете изменить его на любой желаемое значение, которое вам нравится.

...