行分隔符上的标签 – Swift Tableview – 每小时日历

我想创建一个相对基本的小时日历视图,但与Apple的原生日历视图类似。 如何添加标签以与行/单元格分隔符一致,并且不包含在单元格中。 喜欢这个:

在此处输入图像描述

是否有一个属性可以让你为行添加标签? 标签是否必须放在桌面视图之外? 或者是否有单独的表格?

在创建彩色块以表示日历上的事件方面,最好的方法是做什么? 它只是原型单元格中的CGRect吗? 你需要创建单独的xib文件吗?

在此先感谢您的帮助,我仍然是学习Swift的新手!

这是不可能的(或者从技术上讲,它是可能的,但考虑到你的其他选择,开销太高了)。

不要使用单元格分隔符,而是设置separatorStyle = .none ,并在单元格中绘制线条(例如,作为带有view.height = 1view.backgroundColor = .greyUIView )并且通常在单元格中添加标签。

基本上解决方案非常简单:禁用标准分隔线,而是在单元格内部(底部或顶部)绘制分隔符以及标签。 当客户端要求一些自定义花式分隔符时,我就是这样做的 – 我在单元格的底部添加了一个自定义行,并使用了单元格内容的其余部分作为单元格的内容。

编辑

您可以使用以下示例开始(请注意,这只是几种不同方法之一,如何管理它):

 class TimeCellViewController: UITableViewController { override func loadView() { super.loadView() // you can use UITableViewAutomaticDimension instead of static height, if // there will be variable heights that you don't know upfront // https://stackoverflow.com/a/18746930/2912282 // or mine: // https://stackoverflow.com/a/47963680/2912282 tableView.rowHeight = 80 tableView.estimatedRowHeight = 80 tableView.separatorStyle = .none // to allow scrolling below the last cell tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 40)) tableView.register(TimeCell.self, forCellReuseIdentifier: "timeCell") } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 24 } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "timeCell", for: indexPath) as! TimeCell if indexPath.row > 0 { cell.topTime = "\(indexPath.row):00" } else { cell.topTime = "" } cell.bottomTime = "\(indexPath.row + 1):00" return cell } } class TimeCell: UITableViewCell { // little "hack" using two labels to render time both above and below the cell private let topTimeLabel = UILabel() private let bottomTimeLabel = UILabel() private let separatorLine = UIView() var topTime: String = "" { didSet { topTimeLabel.text = topTime } } var bottomTime: String = "" { didSet { bottomTimeLabel.text = bottomTime } } override init(style: UITableViewCellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) selectionStyle = .none contentView.addSubview(topTimeLabel) contentView.addSubview(bottomTimeLabel) contentView.addSubview(separatorLine) topTimeLabel.textColor = UIColor.gray topTimeLabel.textAlignment = .right bottomTimeLabel.textColor = UIColor.gray bottomTimeLabel.textAlignment = .right separatorLine.backgroundColor = UIColor.gray bottomTimeLabel.translatesAutoresizingMaskIntoConstraints = false topTimeLabel.translatesAutoresizingMaskIntoConstraints = false separatorLine.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ bottomTimeLabel.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 0), bottomTimeLabel.centerYAnchor.constraint(equalTo: self.bottomAnchor), bottomTimeLabel.widthAnchor.constraint(equalToConstant: 50), topTimeLabel.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 0), topTimeLabel.centerYAnchor.constraint(equalTo: self.topAnchor), topTimeLabel.widthAnchor.constraint(equalToConstant: 50), separatorLine.leftAnchor.constraint(equalTo: bottomTimeLabel.rightAnchor, constant: 8), separatorLine.bottomAnchor.constraint(equalTo: self.bottomAnchor), separatorLine.heightAnchor.constraint(equalToConstant: 1), separatorLine.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 0), ]) // if you use UITableViewAutomaticDimension instead of static height, // you will have to set priority of one of the height constraints to 999, see // https://stackoverflow.com/q/44651241/2912282 // and // https://stackoverflow.com/a/48131525/2912282 } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } }