Соответствие высоты строки между UITableviews - PullRequest
0 голосов
/ 14 марта 2019

Мое приложение для отображения расписаний сотрудников в магазине.

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

UI

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

В функции heightForRowAt у меня есть

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if tableView.accessibilityIdentifier == "SecondaryTable" {
        var height = tblView.rowHeight
        if let nameCell = tblView.cellForRow(at: indexPath) {
            height = nameCell.frame.height
        } else {
            height = tblView.rowHeight
        }
        return height
    }
    else {
        return UITableView.automaticDimension
    }
}

, которая для таблицы имен возвращает UITableView.automaticDimension и длятаблица часов (идентификатор доступности «SecondaryTable») должна возвращать высоту для соответствующей ячейки в таблице имен, чтобы убедиться, что они выстроены правильно.

Проблема по какой-то причине heightForRowAt вызывается длятаблица расписания, когда таблица имен не загрузила соответствующую ячейку и поэтому возвращает tblView.rowHeight, что не является правильной высотой.Вы можете видеть это во втором-последнем ряду на изображении выше.Я проверил это, проверив, какая таблица расписания indexPath загружалась и что индекс не был в списке видимых ячеек для таблицы имен.

Единственный раз, когда эти таблицы перезагружаются, находится в праве viewWillAppearnow:

    override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    DispatchQueue.main.async {
        self.tblView.reloadData()
        self.secondTblView.reloadData()
    }
}

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

В случае, если это поможет, вот мой cellForRow:

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "scheduleCell") as? ScheduleCell ?? ScheduleCell()
    let cellSchedule = schedule[indexPath.row]
    if tableView.accessibilityIdentifier == "SecondaryTable" {
        let coloredLabel = UILabel()
        coloredLabel.text = "    " + cellSchedule.role
        coloredLabel.backgroundColor = UIColor.green.darker(by: 35)
        coloredLabel.textColor = UIColor.white
        timesHeader.layoutSubviews()
        var drawStartOnHalfHour = false
        var drawEndOnHalfHour = false
        var clockFormat = ClockFormat.TwentyFourHour
        for hour in self.timesHeader.arrangedSubviews{
            let lineLayer = CAShapeLayer()
            let x = hour.center.x
            switch indexPath.row % 2 {
            case 0:
                lineLayer.strokeColor = UIColor.lightGray.cgColor
                break
            default:
                lineLayer.strokeColor = UIColor.white.cgColor
                break
            }

            lineLayer.lineWidth = 2
            let path = CGMutablePath()
            if let header = hour as? UILabel, header.text != nil {
                lineLayer.lineDashPattern = [1,5]
                path.addLines(between: [CGPoint(x: x, y: 5),
                                        CGPoint(x: x, y: cell.contentView.frame.maxY - 5)])
            } else {
                path.addLines(between: [CGPoint(x: x, y: cell.contentView.frame.maxY/2 - 2),
                                        CGPoint(x: x, y: cell.contentView.frame.maxY/2 + 2)])
            }
            lineLayer.path = path
            DispatchQueue.main.async {
                cell.contentView.layer.addSublayer(lineLayer)
            }
            if let header = hour as? UILabel {
                if header.text != nil {
                    var afterNoon = false
                    //On the hour logic

                    var formatCheck = ""
                    if header.text!.split(separator: ":").count == 1 {
                        clockFormat = .TwelveHour
                        formatCheck = String(describing: header.text!.split(separator: " ")[1] )
                    }
                    var headerTime = 0
                    if clockFormat == .TwentyFourHour {
                        headerTime = Int(String(describing: header.text!.split(separator: ":")[0])) ?? 0
                    } else {
                        headerTime = Int(String(describing: header.text!.split(separator: " ")[0])) ?? 0
                    }
                    var UTCCalendar = Calendar.current
                    UTCCalendar.timeZone = TimeZone(abbreviation: "UTC")!
                    var t = UTCCalendar.component(.hour, from: cellSchedule.StartTime)
                    if clockFormat == .TwelveHour && t >= 12{
                        if t > 12 {
                            t = t-12
                        }
                        afterNoon = true
                    }
                    if headerTime == t {
                        let m = UTCCalendar.component(.minute, from: cellSchedule.StartTime)
                        if clockFormat == .TwentyFourHour || ((afterNoon && formatCheck.contains("p")) || (!afterNoon && formatCheck.contains("a")))   {
                            if m == 0 {
                                //Logic for start times on the hour
                                coloredLabel.frame = CGRect(x: x, y: cell.contentView.frame.maxY/4,
                                                            width: 5, height: cell.contentView.frame.maxY/2)
                            } else {
                                //Logic for handling start times on half-hour
                                drawStartOnHalfHour = true

                            }
                        }
                    }
                    var e = UTCCalendar.component(.hour, from: cellSchedule.EndTime)
                    if clockFormat == .TwelveHour && e >= 12{
                        if e > 12 {
                            e = e - 12
                        }
                        afterNoon = true
                    }
                    if headerTime == e {
                        let m = UTCCalendar.component(.minute, from: cellSchedule.EndTime)
                        if clockFormat == .TwentyFourHour || ((afterNoon && formatCheck.contains("p")) || (!afterNoon && formatCheck.contains("a")))   {
                            if m == 0 {
                                //Logic for end time on the hour
                                let width = x - coloredLabel.frame.minX
                                coloredLabel.frame = CGRect(x: coloredLabel.frame.minX,
                                                            y: coloredLabel.frame.minY,
                                                            width: width, height: coloredLabel.frame.height)
                            } else {
                                //Logic for end time on the half-hour
                                drawEndOnHalfHour = true
                            }
                        }
                    }
                } else {
                    //Half-hour logic
                    if drawStartOnHalfHour {
                        drawStartOnHalfHour = false
                        coloredLabel.frame = CGRect(x: x, y: cell.contentView.frame.maxY/4,
                                                    width: 5, height: cell.contentView.frame.maxY/2)
                    } else if drawEndOnHalfHour {
                        drawEndOnHalfHour = false
                        let width = x - coloredLabel.frame.minX
                        coloredLabel.frame = CGRect(x: coloredLabel.frame.minX,
                                                    y: coloredLabel.frame.minY,
                                                    width: width, height: coloredLabel.frame.height)
                    }
                }
            }

        }
        DispatchQueue.main.async {
            cell.contentView.addSubview(coloredLabel)
        }
        switch indexPath.row % 2 {
        case 0:
            let backGround = CALayer()
            backGround.frame = cell.contentView.frame
            backGround.backgroundColor = UIColor.white.cgColor
            cell.contentView.layer.addSublayer(backGround)
            break
        default:
            let backGround = CALayer()
            backGround.frame = CGRect(x: 0,
                                      y: 0,
                                      width: self.timesHeader.frame.width,
                                      height: cell.contentView.frame.height)
            backGround.backgroundColor = UIColor.lightGray.cgColor
            cell.contentView.layer.addSublayer(backGround)
            break
        }
    } else {
        cell.textLabel?.numberOfLines = 2
        let firstName = String(describing: cellSchedule.FirstName!.prefix(35))
        let lastName = String(describing: cellSchedule.LastName!.prefix(35))
        cell.textLabel?.text = firstName.trimmingCharacters(in: CharacterSet(charactersIn: " ")) + "\n" + lastName.trimmingCharacters(in: CharacterSet(charactersIn: " "))
        cell.textLabel?.sizeToFit()
        switch indexPath.row % 2 {
        case 0:
            cell.textLabel?.textColor = UIColor.black
            cell.contentView.backgroundColor = UIColor.white
            break
        default:
            cell.textLabel?.textColor = UIColor.white
            cell.contentView.backgroundColor = UIColor.lightGray
            break
        }

    }

    return cell
}

Любая идея о чистом способе сделать это?

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