이 method는 cell의 디자인을 결정합니다. 여기서 중요한 개념은dequeueReusableCell
입니다.
dequeueReusable이란?
tableview는 메모리를 효율적으로 사용하기 위해서 재사용 queue를 관리하면서 cell 생성 요청이 들어오면 queue에 저장된 cell을 return해줍니다. 만약, 요청시점에 저장된 cell이 없다면 prototype cell을 기반으로 cell을 새로 생성합니다.
tableView가 스크롤 될 때 매끄럽게 보여지려면(스크롤 성능에 영향을 주지 않으려면) 최대한 가볍게 구현해야 합니다. 최대 16ms안에 모든 작업을 완료하고 cell을 리턴할 수 있어야합니다.
self.tableView.separatorInset =
UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
//.singleLineEtched Style은 더이상 사용되지 않는 옵션이고,
//.singleLine과 .default는 같은 속성입니다.
self.tableView.separatorStyle = .singleLine
self.tableView.separatorColor = .blue
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UItableViewCell()
//inset을 바꾸는 것만 가능
if indexPath.row == 1 {
cell.separatorInset =
UIEdgeInsets(top: 0, left: 30, bottom: 0, right: 0)
}
else if indexPath.row == 2 {
cell.separatorInset =
UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 30)
}
else {
cell.separatorInset = self.listTableView.separatorInset
}
return cell
}
indexPathForRow(at: CGPoint) : 해당 CGPoint에 있는 cell의 index값을 return합니다.
indexPathsForRows(in: CGRect) : 해당 CGRect 안에 있는 cell 들의 index를 배열로 return합니다.
tableView.indexPathsForVisibleRows : 화면에 표시된 cell들의 index를 배열로 return합니다.
tableView.indexPathForSelectedRow : 현재 선택되어있는 cell의 index를 return합니다.
tableView.indexPathsForSelectedRows : tableView가 선택된 cell들의 index를 배열로 return합니다.(multiple selection이 가능할 때 사용)
cell.accessoryType = .disclosureIndicator
cell.accessoryType = .checkmark
cell.accessoryType = .detailButton
cell.accessoryType = .detailDisclosureButton
class AccessoryCustomViewCell: UITableViewCell {
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
let v = UIImageView(image: UIImage(named: "star"))
accessoryView = v
}
}
func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath) {
//여기서 tap이벤트를 구현합니다.
//customView로 AccessoryView를 만들 경우 역시 호출되지않습니다.
}
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = UITableViewAutomaticDimension
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
// 특정 index의 height값은 고정으로 주고 나머지는 자동으로 계산하기
if indexPath.row == 0 {
return 100
} else {
return UITableViewAutomaticDimension
}
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
//이 method를 사용하면 scroll의 기능을 더 향상시킬 수 있음.
if indexPath.row == 0 {
return 100
} else {
return UITableViewAutomaticDimension
}
}