#ios #swift #swift3 #swift5 #swift5.5
Вопрос:
У меня есть набор uitableviewcell . Я хочу применить цвет границы для следующих условий, Применяя цвет верхней границы для firstcell И цвет нижней границы для lastcell.
Я новичок в swift, поэтому не уверен, возможно ли это.
Ответ №1:
Это можно сделать. Что вам нужно сделать, так это,
- Создайте пользовательскую
UITableView
ячейку, оформите ее так, как вы хотите. - После укладки добавьте 2
UIView
буквы с высотой1
или любой высотой, которую вы хотите, если на то пошло. Давайте назовем ихtopSeparator
amp;bottomSeparator
в демонстрационных целях. - Ограничьте один из заголовков в верхней части
ContentView
пользовательской ячейки tableview, а другой-в нижней части. - Предполагая, что вы используете
Storyboards
, подключите обеtopSeparator
amp;bottomSeparator
к пользовательской ячейке, - Там после
disable
обоихtopSeparator
amp;bottomSeparator
в методахinit(frame:)
илиawakeFromNib()
в зависимости от того, собираетесь ли вы делать это программно илиNibs
с помощью . - Добавьте 2 метода следующим образом в класс ячейки
// Unhides top s
func showTopSeparator() {
self.topSeparator.isHidden = false
}
// Unhides bottom separator
func showBottomSeparator() {
self.bottomSeparator.isHidden = false
}
- И в viewcontroller, который будет отображать ячейки, добавьте флаг для отображения разделителей на основе
IndexPath
ячеек. Смотреть ниже
func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// Dequeueing custom cell
let cell = self.tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath as IndexPath) as! CustomCell
// Flag to display separators
if indexPath.row == 0 {
cell.showTopSeparator()
else if indexPath.row == data.count - 1 {
cell.showBottomSeparator()
}
return cell
}
Комментарии:
1. самостоятельный разделитель дна. isHidden = false В приведенной выше строке что такое разделитель дна? является ли это свойством или я должен объявить переменную и что-то к ней
2.
bottomSeperator
иtopSeparator
есть 2UIViews
с aheight
по вашему вкусу.
Ответ №2:
Добавьте Extension
.
Вы можете добавить приведенный ниже код в свой ViewController
файл или создать отдельный файл, как я.
CALayer Расширение.swift
import UIKit
extension CALayer {
func addBorder(edge: UIRectEdge, color: UIColor, thickness: CGFloat) {
let border = CALayer();
switch edge {
case UIRectEdge.top:
border.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: thickness)
break
case UIRectEdge.bottom:
border.frame = CGRect(x:0, y:self.frame.height - thickness, width:self.frame.width, height:thickness)
break
case UIRectEdge.left:
border.frame = CGRect(x:0, y:0, width: thickness, height: self.frame.height)
break
case UIRectEdge.right:
border.frame = CGRect(x:self.frame.width - thickness, y: 0, width: thickness, height:self.frame.height)
break
default:
break
}
border.backgroundColor = color.cgColor;
self.addSublayer(border)
}
}
TableViewController.swift
import UIKit
class TableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
let arr = ["a", "b", "c", "d"]
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
tableView.tableFooterView = UIView(frame: .zero)
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return arr.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell") as? TableViewCell else { return UITableViewCell() }
cell.label.text = arr[indexPath.row]
//Setting the border
if indexPath.row == 0 { //first cell
cell.layer.addBorder(edge: .top, color: .blue, thickness: 0.5)
}
if indexPath.row == arr.count - 1 { //last cell
cell.layer.addBorder(edge: .bottom, color: .blue, thickness: 0.5)
}
return cell
}
}
Если вы хотите удалить границу, кроме первой и последней ячеек, вы можете изменить это свойство на none
.