Как рассчитать размер пользовательских ячеек со стеками внутри? - PullRequest
0 голосов
/ 09 мая 2018

У меня есть требование, где мне нужно сделать пользовательскую ячейку UiTableview. Я сделал это, и это работало просто отлично, как и ожидалось. Но теперь внутри ячейки я должен показать несколько записей (зависит от числа по предмету, в котором учится студент). так что я могу упростить свой вопрос следующим образом

Case У меня есть список студентов, поступающих с сервера, в котором есть список зачислений против каждого студента. Поэтому я должен показать каждому студенту и его нескольким зачисленным предметам.

Мой подход Я создал ячейку с UiTextLabel для отображения имени. И ниже этого я взял Stackview вертикально, который покажет количество предметов. Таким образом, я буду заполнять каждый студент зачисленные предметы в этом вертикальном стеке программно.

код

 func createEnrollemtStackView(_ mEnrollment : EnrollmentServiceModel ) -> UIStackView {
    var enrolledIn = "Not enrolled"

    if(mEnrollment.GradeServiceModel != nil && mEnrollment.GradeServiceModel?.Name != nil && mEnrollment.GradeServiceModel?.Name != ""){
        let gradeName = (mEnrollment.GradeServiceModel?.Name)!
        let gradeSectionName = mEnrollment.GradeSectionName
        let batchName = mEnrollment.BatchServiceModel?.Name

        enrolledIn = "\(gradeName) - \(gradeSectionName!) (\(batchName))"

    }else{

        let batchName = mEnrollment.BatchServiceModel?.Name
        let className = mEnrollment.ClassServiceModel?.Name

        enrolledIn = "\(batchName) (\(className)) school"
    }


    let lblEnrolledIn = UILabel()
    lblEnrolledIn.text = "Enrolled in"
    lblEnrolledIn.textColor = UIColor(hex:"F48024")
    lblEnrolledIn.font = lblEnrolledIn.font.withSize(10)
    lblEnrolledIn.font = UIFont.boldSystemFont(ofSize: 10.0)

    let lblEnrolledStatus = UILabel()
    lblEnrolledStatus.text = "Enrolled Status"
    lblEnrolledStatus.textColor = UIColor(hex:"F48024")
    lblEnrolledStatus.font = lblEnrolledStatus.font.withSize(10)
    lblEnrolledStatus.font = UIFont.boldSystemFont(ofSize: 10.0)

    let tvEnrolledIn = UILabel()
    tvEnrolledIn.text = enrolledIn
    tvEnrolledIn.font = tvEnrolledIn.font.withSize(13)
    tvEnrolledIn.backgroundColor = UIColor.green

    let tvEnrolledStatus = UILabel()
    tvEnrolledStatus.text = mEnrollment.EnrollmentStaus
    tvEnrolledStatus.font = tvEnrolledStatus.font.withSize(13)

    let stackViewHorizontal   = UIStackView()
    stackViewHorizontal.axis  = UILayoutConstraintAxis.horizontal
    stackViewHorizontal.distribution  = UIStackViewDistribution.fillEqually
    stackViewHorizontal.alignment = UIStackViewAlignment.leading
    stackViewHorizontal.spacing = 5


    let enrollmentSV = UIStackView()
    enrollmentSV.axis  = UILayoutConstraintAxis.vertical
    enrollmentSV.distribution  = UIStackViewDistribution.fillEqually
    enrollmentSV.alignment = UIStackViewAlignment.leading
    enrollmentSV.spacing = 3
    enrollmentSV.backgroundColor = UIColor.brown


    enrollmentSV.addArrangedSubview(lblEnrolledIn)
    enrollmentSV.addArrangedSubview(tvEnrolledIn)


    enrollmentSV.translatesAutoresizingMaskIntoConstraints = false
    enrollmentSV.leadingAnchor.constraint(equalTo: stackViewHorizontal.leadingAnchor,constant:0)
    enrollmentSV.trailingAnchor.constraint(equalTo: stackViewHorizontal.trailingAnchor,constant:0)
    enrollmentSV.topAnchor.constraint(equalTo: stackViewHorizontal.topAnchor,constant:0)
    enrollmentSV.bottomAnchor.constraint(equalTo: stackViewHorizontal.bottomAnchor,constant:0)



    let statusSV = UIStackView()

    statusSV.axis  = UILayoutConstraintAxis.vertical
    statusSV.distribution  = UIStackViewDistribution.fillEqually
    statusSV.alignment = UIStackViewAlignment.leading
    statusSV.spacing = 3
    statusSV.backgroundColor = UIColor.blue
    //
    //
    statusSV.addArrangedSubview(lblEnrolledStatus)
    statusSV.addArrangedSubview(tvEnrolledStatus)



    statusSV.translatesAutoresizingMaskIntoConstraints = false
    statusSV.leadingAnchor.constraint(equalTo: stackViewHorizontal.leadingAnchor,constant:0)
    statusSV.trailingAnchor.constraint(equalTo: stackViewHorizontal.trailingAnchor,constant:0)
    statusSV.topAnchor.constraint(equalTo: stackViewHorizontal.topAnchor,constant:0)
    statusSV.bottomAnchor.constraint(equalTo: stackViewHorizontal.bottomAnchor,constant:0)



    stackViewHorizontal.addArrangedSubview(enrollmentSV)
    stackViewHorizontal.addArrangedSubview(statusSV)



    return stackViewHorizontal
}

Я вызываю эту функцию из следующего метода

func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

Эта функция дает мне еще 2 горизонтально выровненных стека, которые сами по себе вертикальны и содержат мои данные о регистрации, такие как зарегистрировано и зарегистрировано.

данные действительны. Но я сталкиваюсь с проблемами. Это как под.

  1. Как рассчитать высоту строки ??
  2. Почему мой вид стека, который программно добавляется в спроектированный вид стека, имеет отступ слева?

1 Ответ

0 голосов
/ 09 мая 2018

В вашем коде есть ошибки, которые вы добавляете enrollmentSV и statusSV в stackViewHorizontal:

    stackViewHorizontal.addArrangedSubview(enrollmentSV)
    stackViewHorizontal.addArrangedSubview(statusSV)

Так что нет необходимости отправлять ограничение на enrollmentSV & statusSV. Они будут автоматически настроены с помощью stackViewHorizontal.


Для высоты строки вам не нужно рассчитывать размер. Хотя просто присвойте высоту UITabelViewAutomaticDimension как:

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

Но для этого к вашей ячейке должны быть привязаны верхние и нижние ограничения. Следуйте картинке ниже:

Где стек - ваш stackViewHorizontal, а сверху, снизу, впереди и сзади прикреплен к UITableViewCell.

Из-за ограничения сверху и снизу и UITableViewAutomaticDimension эти ячейки таблицы станут автоматически изменяющими размер .

enter image description here


Обновление

В случае, если ваш стек виден внутри клетки. Не назначайте высоту только для просмотра top, bottom, leading and trailing w.r.t. на ContentView, он будет автоматически получен из содержимого внутреннего стека:

enter image description here

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