Search
Duplicate

브랜드 상세 정보에서 셀 확장 시 자동 스크롤 구현하기

생성일
2024/07/09 23:54
태그
슬기로운 인턴생활
비플페이
v1.8.9

🫧 브랜드 상세 정보에서 셀 확장 시 자동 스크롤 구현하기

우리 앱에서 안드로이드에는 ‘사용안내’ 나 ‘교환안내’ 셀 오른쪽에 아이콘을 누르면 접힌 페이지가 부드럽게 펼쳐지는 모션이 있었는데, iOS 쪽에는 부드럽게 펼쳐지는 모션 없이 아래와 같이 뚝 끊기는 식으로 접힌 페이지가 펼쳐 졌었다. 넘 신경쓰였음,,, 그래서 구현해보았다!
먼저 이 셀들을 가져와 처리하는 테이블뷰를 찾아야겠지?
구성은 BrandDetailViewController의 테이블뷰에서 셀들을 처리한다는 것을 알아냈다.
그리고
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if indexPath.section == 1 { guard let data = viewModel?.cellData else{ return } if data[indexPath.row + 1].cellType == .foldedCell { guard data[indexPath.row + 1] is BrandDetailFoldedTableViewCell.FoldedCellData else{ return } guard let cell = tableView.cellForRow(at: indexPath) as? BrandDetailFoldedTableViewCell else{return} self.updateExpandCell(dataIndex: indexPath.row + 2, touchedCell: cell ) } } }
Swift
복사
그리고 여기 코드를 보면
선택된 셀의 바로 다음 셀이 .foldedCell 타입인지 확인하고, 다음 셀의 데이터가 FoldedCellData 타입인지 확인한다.
그리고 현재 선택된 셀을 BrandDetailFoldedTableViewCell 타입으로 캐스팅한 후
updateExpandCell 메서드를 호출하여 셀을 확장한다.
dataIndex = 현재 선택된 셀의 인덱스에서 + 2
touchedCell = 선택된 셀
을 나타낸다.
기존 코드 요약해보면
특정 섹션의 셀을 선택했을 때, 그 다음 셀이 특정 타입이라면, 선택된 셀을 확장!
이제 요 펼치는 과정에서 자동 스크롤을 넣어보자!
셀을 확장해주는 함수는
private func updateExpandCell(dataIdx: Int, touchedCell: BrandDetailFoldedTableViewCell){ if self.expandedCells.contains(dataIdx) { touchedCell.arrowDown() if touchedCell.data?.infoTitle == "사용 안내" { isNeedDivideViewHidden = false }else{ self.tableView.backgroundColor = UIColor(hexString: "#FFFFFF") } expandedCells.remove(at: expandedCells.firstIndex(of: dataIdx)!) }else{ touchedCell.arrowUp() if touchedCell.data?.infoTitle == "사용 안내" { isNeedDivideViewHidden = true }else{ self.tableView.backgroundColor = UIColor(hexString: "#F9F9F9") } expandedCells.append(dataIdx) } self.tableView.reloadData() }
Swift
복사
요 부분! 이 부분 코드를 자동 확장 스크롤 처리 코드를 넣어
private func updateExpandCell(dataIndex: Int, touchedCell: BrandDetailFoldedTableViewCell){ if self.expandedCells.contains(dataIndex) { touchedCell.arrowDown() if touchedCell.data?.infoTitle == "사용 안내" { isNeedDivideViewHidden = false }else{ self.tableView.backgroundColor = UIColor(hexString: "#FFFFFF") } expandedCells.remove(at: expandedCells.firstIndex(of: dataIndex)!) }else{ touchedCell.arrowUp() if touchedCell.data?.infoTitle == "사용 안내" { isNeedDivideViewHidden = true }else{ self.tableView.backgroundColor = UIColor(hexString: "#F9F9F9") } expandedCells.append(dataIndex) } self.tableView.reloadRows(at: [IndexPath(row: dataIndex, section: 1)], with: .automatic) DispatchQueue.main.async { let totalRows = self.tableView.numberOfRows(inSection: 1) if dataIndex < totalRows { self.tableView.scrollToRow(at: IndexPath(row: dataIndex, section: 1), at: .top, animated: true) } else if dataIndex == totalRows { self.tableView.scrollToRow(at: IndexPath(row: dataIndex-1, section: 1), at: .bottom, animated: true) } } }
Swift
복사
이렇게 구성하였다.
셀을 확장하거나 축소할 때 시각적인 변화와 해당 셀로 스크롤을 처리하기 위해서 비동기 처리를 하였다.
우선 섹션 1의 총 행수를 totalRows 라는 변수에 담고,
dataIndex가 totalRows 수보다 적으면 선택된 셀로 스크롤하고, dataIndex가 totalRows 수와 같으면 이전 셀로 스크롤하도록 구성하였다.
이렇게 구성하니,
이렇게 셀이 펼쳐질 때 자동 스크롤이 진행되어 초점이 맞춰졌다!
오늘의 슬기로운 인턴생활 끝
그리고 이 업데이트도 다음 배포에 들어갔으면 하는 개인적인 작은 바램 ㅎㅎㅎ