Макет для 2 UILabels на UITableViewCell - PullRequest
0 голосов
/ 12 октября 2019

Я хочу иметь 2 метки в ячейке пользовательского табличного представления. Первая метка должна быть слева в 15 точках от левого поля, а вторая метка должна быть справа в 15 точках от правого поля. Это может расти внутри. Поскольку метка не будет отображать большое количество данных, она точно не будет перекрывать друг друга.

Я использую представление стека. Ниже приведены изображения для моего пользовательского файла XIB. Количество строк для обеих меток установлено на 1. При запуске я вижу пустую ячейку без меток. Чего не хватает?

enter image description here

enter image description here

enter image description here

enter image description here

РЕДАКТИРОВАТЬ: Добавление более подробной информации. Я обновил дистрибутив в UIStackView, чтобы заполнить одинаково, и обновил выравнивание для 2-й метки, т.е. метки времени начала справа. Сейчас я вижу данные в ячейке, но вторая метка не выравнивается по правому краю.

enter image description here

enter image description here Код в cellForRow:

let cell = tableView.dequeueReusableCell(withIdentifier: "displayStartTime") as! ScheduleDisplayStartTimeCustomCell
cell.selectionStyle = UITableViewCell.SelectionStyle.gray
cell.titleLabel.text = "Start"
cell.timeLabel.text = startTime
return cell

Thisкак это выглядит сейчас после редактирования:

enter image description here

Ответы [ 3 ]

2 голосов
/ 13 октября 2019

Решение раскадровки:

Вы можете выбрать распределение для StackView равным интервалу в раскадровке со значением расстояния по умолчанию. После этого меткам требуется только ограничение высоты (или вы можете установить высоту для StackView), и они будут расположены по бокам StackView.

Результирующая ячейка

Выравнивание текста в метке не имеет значения, так как метка будет иметь настолько широкий размер, насколько это необходимо.

1 голос
/ 13 октября 2019

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

tableView.register(ScheduleDisplayStartTimeCustomCell.self, forCellReuseIdentifier: "displayStartTime")

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

class ScheduleDisplayStartTimeCustomCell: UITableViewCell {

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

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

    let startLabel: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.numberOfLines = 1
        label.textAlignment = .left
        return label
    }()

    let timeLabel: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.numberOfLines = 1
        label.textAlignment = .right
        return label
    }()


    func setupView() {
        addSubview(startLabel)
        addSubview(timeLabel)

        NSLayoutConstraint.activate([
            startLabel.centerYAnchor.constraint(equalTo: self.centerYAnchor, constant: 0),
            startLabel.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 15),

            timeLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -15),
            timeLabel.centerYAnchor.constraint(equalTo: self.centerYAnchor, constant: 0),
        ])

        self.selectionStyle = UITableViewCell.SelectionStyle.gray
    }

}

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

  override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "displayStartTime") as! ScheduleDisplayStartTimeCustomCell
        cell.startLabel.text = "Start"
        cell.timeLabel.text = startTime

        return cell
    }

0 голосов
/ 13 октября 2019

У меня были подобные проблемы в прошлом, лучшее решение, которое я нашел, это назначить BackgroundColor для меток (синий, красный) и StackView (черный). Затем я вижу, связана ли проблема с ограничениями или свойствами выравнивания текста UILabel.

Кроме того, я заметил, что у вас есть расширение для UIViews, там может быть что-то, что вызывает проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...