[ios] Expanding UITableViewCell

Cobugi·2022년 3월 29일
1
post-thumbnail

Expanding UITableViewCell

결과

설명

  • 셀에서 isExpand 프로퍼티를 만든다 -> 초기값은 false
  • 셀을 선택했을 때 확장이 되어야하므로 isExpandtrue로 변경후 셀을 확장하면 된다
  • isExpandtrue인 상황에서는 또 선택하면 false로 변경후 셀을 다시 줄이면 된다
  • 셀의 변경사항은
    • tableView.beginUpdates()
       cell.expand()
       tableView.endUpdates()
    • beginUpdates()endUpdates() 사이에 넣어준다

전체 코드

import UIKit
import SnapKit

class ExpandingViewController: UIViewController {
    
    private let cellList = [
        "구할 창공에 웅대한 품고 끝까지 있는 예수는 봄바람이다. 우리의 못하다 가슴이 실현에 튼튼하며, 가는 하여도 것이다.",
        "별 별을 내린 책상을 봅니다. 위에 그리워 슬퍼하는 별 이국 별 봅니다. 아침이 것은 오면 거외다. 지나가는 별을 헤일 파란 남은 아이들의 시인의 버리었습니다. 이름과 하나에 언덕 밤이 그리고 걱정도 파란 거외다. 자랑처럼 묻힌 어머니, 어머님, 듯합니다. 별 무엇인지 릴케 보고, 겨울이 노새, 나는 있습니다. 이름과, 이름자를 노새, 어머님, 무성할 별 듯합니다. 어머니 아스라히 다 노새, 이웃 이네들은 아침이 하나에 어머니, 버리었습니다. 헤는 덮어 했던 별 추억과 봄이 이런 거외다. 못 하나에 벌써 했던 한 버리었습니다. 파란 나는 당신은 마디씩 있습니다. 나는 많은 패, 흙으로 불러 어머니 계십니다. 내일 말 가득 어머니 시와 있습니다. 가슴속에 북간도에 이름을 그리워 하나에 둘 나의 아이들의 밤을 있습니다. 하나에 슬퍼하는 겨울이 위에도 동경과 프랑시스 아침이 까닭입니다. 노루, 이런 가을로 별 이 이름과, 봅니다. 걱정도 까닭이요, 무성할 시인의 멀듯이, 가득 거외다. 내일 못 멀리 우는 그러나 이름과, 별빛이 흙으로 가난한 까닭입니다. 자랑처럼 하나의 아이들의 별 별 계십니다. 위에 불러 별 까닭입니다. 이 겨울이 흙으로 마디씩 계십니다. 못 가을 파란 많은 별 하나에 다 계집애들의 계십니다. 어머님, 까닭이요, 밤을 위에 별빛이 이런 어머니 마리아 있습니다. 하나에 이국 부끄러운 불러 계십니다. 무엇인지 벌써 가을 계십니다. 했던 하나의 위에 듯합니다. 너무나 북간도에 별에도 써 멀리 이름과 봅니다. 이 소학교 옥 라이너 무덤 때 별 멀듯이, 있습니다. 속의 가득 내 거외다. 별 하나에 프랑시스 라이너 새겨지는 별에도 무덤 까닭입니다.",
        "있으며, 같은 끝까지 사는가 그림자는 인간의 이것이다. 날카로우나 물방아 거친 이것을 얼마나 있으며, 불러 할지라도 옷을 황금시대다. 목숨을 풀이 사랑의 피가 무엇을 설레는 있는 구할 그러므로 힘있다. 대한 원대하고, 품으며, 우는 가치를 커다란 위하여 때문이다. 그들은 얼마나 위하여 가진 구할 때문이다. 사는가 것이다.보라, 인간의 피가 바이며, 영원히 일월과 새가 뿐이다. 노년에게서 풍부하게 군영과 못할 피에 약동하다. 품에 웅대한 것은 그림자는 평화스러운 없으면 붙잡아 찾아 두기 것이다. 있을 같은 소리다.이것은 때에, 곳이 아니다. 가치를 우리 트고, 바로 충분히 부패뿐이다. 얼음 전인 생생하며, 가장 그림자는 산야에 이상은 사막이다. 보이는 열매를 우리 아름다우냐?",
        "밥을 것은 그들을 있음으로써 하는 행복스럽고 피부가 인류의 싶이 봄바람이다. 평화스러운 곳으로 구하지 사랑의 아름답고 교향악이다. 꽃 이상이 피가 날카로우나 우리는 많이 보라. 듣기만 맺어, 얼마나 크고 끓는 그러므로 이것이다. 이상을 따뜻한 가슴에 위하여 그들은 이것이다. 보배를 목숨이 불어 커다란 예가 길을 이상의 날카로우나 있는 것이다. 천고에 것이 찾아 보배를 용기가 위하여 이것이다. 청춘에서만 피가 풍부하게 아니한 그리하였는가? 피고 만천하의 지혜는 목숨이 안고, 이상을 영락과 수 것이다. 없으면 열매를 시들어 어디 남는 청춘은 인간이 뿐이다. 우리는 없으면, 같은 이 부패뿐이다. 끓는 천고에 새가 봄바람을 이상의 이성은 이상은 있는 봄바람이다. 위하여 두기 인생을 황금시대다. 같이, 돋고, 인생에 따뜻한 것이다.",
        "헤는 헤일 마디씩 나는 소학교 가득 그리고 계십니다. 새겨지는 릴케 별빛이 별 별이 것은 북간도에 덮어 계절이 거외다. 내 옥 별 나는 까닭입니다. 경, 이웃 프랑시스 추억과 무성할 밤을 별에도 별이 써 까닭입니다. 부끄러운 지나가는 별을 시인의 까닭입니다. 다하지 가득 봄이 까닭입니다. 책상을 차 하나에 듯합니다. 사랑과 별을 다 가난한 있습니다. 시와 어머니, 아이들의 나는 불러 별 내 까닭입니다. 내 새워 이런 듯합니다. 걱정도 책상을 된 아무 이름자 파란 옥 있습니다. 계집애들의 속의 하나 별 자랑처럼 하나에 불러 나의 다 까닭입니다. 덮어 불러 패, 언덕 이제 내 이름자를 밤이 버리었습니다. 마리아 벌레는 하나에 밤을 까닭입니다. 나의 우는 다하지 시인의 별 묻힌 그러나 봅니다. 마디씩 별을 노새, 이국 봅니다. 나는 부끄러운 시와 겨울이 잔디가 까닭입니다. 시와 소녀들의 어머니 까닭이요, 추억과 벌레는 계십니다. 밤을 헤는 불러 계집애들의 아무 있습니다. 하나 내 비둘기, 하나에 계절이 나는 노새, 봅니다. 이름자 않은 아침이 때 라이너 하나에 가득 나의 계십니다. 어머니 사랑과 어머니, 봅니다. 나는 어머니, 오는 너무나 않은 같이 걱정도 소학교 계십니다. 위에 쓸쓸함과 당신은 쉬이 계십니다. 별빛이 가을 아름다운 새워 무덤 아침이 너무나 봅니다. 별 그리고 별 사람들의 잔디가 까닭입니다. 이름을 이름과, 소학교 했던 마리아 그리고 버리었습니다. 같이 지나가는 당신은 피어나듯이 애기 이름과, 언덕 까닭입니다. 하나 아무 그리워 별 덮어 위에 까닭입니다. 헤일 토끼, 아스라히 버리었습니다.",
        "딴은 새워 계절이 가을 이름자 계십니다. 이국 아이들의 봄이 피어나듯이 지나가는 지나고 것은 언덕 버리었습니다. 시와 위에 헤는 쉬이 다하지 있습니다. 별 경, 나의 멀리 위에도 밤이 둘 별빛이 별 있습니다. 오면 풀이 묻힌 토끼, 헤는 언덕 불러 있습니다. 새겨지는 내일 하나에 거외다. 이름자 사람들의 멀듯이, 아직 책상을 하나에 다 토끼, 새워 봅니다. 토끼, 하나의 자랑처럼 별 밤이 잔디가 거외다. 이런 애기 사람들의 위에도 있습니다. 언덕 겨울이 하나 나는 쓸쓸함과 보고, 내 별이 패, 버리었습니다. 이름을 잠, 사람들의 나는 이런 쓸쓸함과 봅니다. 동경과 지나고 무엇인지 이제 북간도에 아침이 없이 아스라히 버리었습니다. 노루, 않은 그러나 하나에 소학교 이웃 옥 묻힌 못 거외다. 시인의 별 까닭이요, 지나고 어머니, 릴케 무성할 다 버리었습니다. 경, 하늘에는 멀리 이름과, 별 그러나 까닭이요, 계집애들의 그리고 듯합니다. 없이 그리워 별빛이 프랑시스 하나에 내 다 쓸쓸함과 아름다운 있습니다. 헤는 다 하나에 이름을 까닭이요, 거외다. 그러나 잠, 불러 별 별 아무 벌써 이름자를 봅니다. 별들을 별 별빛이 많은 가난한 봅니다. 보고, 아이들의 이름을 속의 듯합니다. 가난한 걱정도 강아지, 이런 이 보고, 이름과 있습니다. 이름과, 새겨지는 무성할 벌써 했던 별 둘 이름자를 어머님, 봅니다. 소학교 강아지, 쉬이 나는 아침이 라이너 무덤 있습니다. 청춘이 별 하늘에는 프랑시스 잔디가 이네들은 이름과, 있습니다. 북간도에 이름과, 마디씩 하나에 써 이름을 언덕 애기 계십니다. 하나에 새워 라이너 된 별에도 별빛이 어머니 지나고 까닭입니다. 하나에 멀듯이, 북간도에 멀리 당신은 이름을 쓸쓸함과 봅니다. 그리워 지나고 아직 많은 별 듯합니다. 못 이름자 않은 까닭입니다. 가슴속에 걱정도 노루, 어머님, 남은 있습니다. 하나 이런 슬퍼하는 그리고 계집애들의 강아지, 까닭입니다. 마리아 이름자를 계집애들의 이런 그러나 것은 봅니다. 그러나 북간도에 강아지, 있습니다. 언덕 내 가슴속에 슬퍼하는 별을 별빛이 별이 별 있습니다. 피어나듯이 마디씩 벌써 위에 써 멀리 별빛이 봅니다. 잔디가 아름다운 어머님, 라이너 릴케 책상을 속의 하나에 멀듯이, 듯합니다. 차 이름자를 사람들의 까닭입니다. 청춘이 비둘기, 계집애들의 시와 이름과 무엇인지 하나에 별 거외다. 경, 남은 북간도에 하나에 부끄러운 덮어 봅니다. 청춘이 이제 이름을 하나에 프랑시스 어머니 이런 봅니다.",
        "나의 다하지 멀리 것은 밤을 거외다. 때 무성할 이 하나에 많은 별 같이 까닭이요, 나의 계십니다. 시인의 많은 까닭이요, 있습니다. 이름과, 겨울이 이 이름자를 별 것은 별 슬퍼하는 나의 있습니다. 이름을 시와 이름과, 하나에 프랑시스 이웃 까닭이요, 벌써 이름과 까닭입니다. 별 말 사랑과 했던 불러 겨울이 이네들은 있습니다. 이름을 애기 벌레는 쉬이 가을로 하나 이네들은 피어나듯이 보고, 계십니다. 시와 새겨지는 없이 나의 파란 잠, 봅니다. 남은 별 계집애들의 하나에 같이 까닭입니다. 하나에 이런 지나고 이 쉬이 멀리 그러나 무엇인지 별을 계십니다. 별 마디씩 봄이 위에 별들을 새겨지는 북간도에 버리었습니다. 속의 했던 한 아스라히 않은 무성할 별 내린 듯합니다. 흙으로 계절이 헤일 가을 말 피어나듯이 나의 노새, 거외다. 지나고 어머니, 하나에 까닭입니다. 어머님, 오는 무성할 나는 하나에 나의 있습니다. 둘 어머니, 하나에 내린 까닭입니다. 별 지나고 나의 잠, 가난한 봅니다. 당신은 아름다운 별 까닭이요, 있습니다. 무덤 시와 오면 별이 계절이 어머님, 새워 듯합니다. 하나에 별빛이 벌레는 사람들의 애기 이국 하나에 버리었습니다. 이런 이름자를 하나에 아이들의 사람들의 별 계십니다.",
        "별빛이 지나가는 하나에 까닭입니다. 별에도 내린 때 마리아 우는 하나에 봅니다. 오면 위에 계집애들의 있습니다. 애기 위에 흙으로 이국 이름과, 않은 그리워 토끼, 보고, 까닭입니다. 새워 하나에 토끼, 너무나 언덕 거외다. 하나에 불러 소학교 별 경, 계집애들의 봅니다. 나는 이름과, 않은 차 그러나 별 가슴속에 이국 봅니다. 별 헤일 북간도에 어머님, 말 지나가는 버리었습니다. 별 어머니, 별 이름과, 이웃 것은 당신은 버리었습니다.",
        "하나에 토끼, 별에도 버리었습니다. 하나에 된 새워 딴은 밤을 하나 어머니 버리었습니다. 걱정도 그리워 묻힌 이 봅니다. 별 무엇인지 새워 아름다운 된 못 있습니다. 마디씩 강아지, 위에도 흙으로 까닭입니다. 잔디가 아침이 패, 거외다. 내 때 별 없이 이름을 그러나 내일 밤을 거외다. 써 아름다운 어머님, 이름자 사랑과 겨울이 하늘에는 파란 까닭입니다. 위에 이름과, 나는 사랑과 추억과 가을 남은 버리었습니다. 나의 이름자를 못 이름과 별이 위에 까닭이요, 이국 내일 계십니다. 언덕 것은 가을로 이름과, 듯합니다. 이국 노새, 봄이 하나에 그리워 다하지 벌레는 언덕 듯합니다. 시인의 시와 헤일 어머니, 잔디가 아침이 까닭입니다. 헤일 시인의 사람들의 내 새겨지는 지나고 아직 있습니다. 다 별들을 헤일 파란 봅니다. 어머니, 무덤 다 다 나는 이름자를 있습니다. 이름을 이제 못 덮어 쓸쓸함과 어머니, 듯합니다. 것은 보고, 하늘에는 벌써 시인의 위에 흙으로 새워 겨울이 봅니다. 추억과 가을로 말 무덤 우는 거외다. 부끄러운 하나에 나는 가을로 프랑시스 듯합니다. 어머님, 밤을 당신은 못 이 덮어 쓸쓸함과 강아지, 겨울이 있습니다. 이름과, 노루, 묻힌 흙으로 이제 버리었습니다. 무덤 나의 하나에 이런 많은 이름자 내일 북간도에 버리었습니다. 라이너 가득 별 있습니다. 멀리 다하지 시와 지나가는 노루, 나는 이런 너무나 오면 까닭입니다. 책상을 부끄러운 무덤 아직 무엇인지 새겨지는 이름을 시와 파란 듯합니다. 옥 계집애들의 시인의 불러 어머님, 밤을 버리었습니다. 멀듯이, 어머니, 시인의 어머니 위에도 거외다. 지나고 이네들은 그러나 잠, 너무나 하나에 까닭입니다.",
        "이름을 무엇인지 하나에 벌레는 때 이름을 아무 릴케 내 버리었습니다. 사랑과 당신은 같이 마디씩 토끼, 북간도에 많은 이름자 계십니다. 언덕 새겨지는 피어나듯이 하나에 이제 까닭이요, 위에도 봅니다. 사람들의 까닭이요, 이런 불러 이 이름과, 아스라히 있습니다. 북간도에 없이 차 듯합니다. 풀이 토끼, 나는 거외다. 덮어 둘 노새, 내 있습니다. 다 벌써 마리아 까닭이요, 거외다. 시와 하나에 어머님, 듯합니다. 무덤 노루, 아침이 애기 언덕 별 했던 보고, 버리었습니다."
    ]
    
    private let tableView = UITableView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        attribute()
        layout()
    }
    
}
extension ExpandingViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return cellList.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as? TableViewCell else { return UITableViewCell() }
        cell.setupView(content: cellList[indexPath.row])
        return cell
    }
}

extension ExpandingViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        guard let cell = tableView.cellForRow(at: indexPath) as? TableViewCell else { return }
        
        cell.isExpand = !cell.isExpand
        
        tableView.beginUpdates()
        cell.expand()
        tableView.endUpdates()
    }
}

private extension ExpandingViewController {
    func attribute() {
        tableView.rowHeight = UITableView.automaticDimension
        tableView.estimatedRowHeight = 300.0
        tableView.dataSource = self
        tableView.delegate = self
        tableView.register(TableViewCell.self, forCellReuseIdentifier: "Cell")
    }
    func layout() {
        view.addSubview(tableView)
        tableView.snp.makeConstraints {
            $0.edges.equalToSuperview()
        }
    }
}


// MARK: - TableViewCell
class TableViewCell: UITableViewCell {
    
    private let contentLabel = UILabel()
    
    var isExpand: Bool = false
    
    func setupView(content: String) {
        attribute()
        layout()
        contentLabel.text = content
    }
    func expand() {
        contentLabel.numberOfLines = isExpand ? 0 : 5
    }
}

private extension TableViewCell {
    func attribute() {
        contentLabel.numberOfLines = 5
        contentLabel.font = .systemFont(ofSize: 14.0, weight: .medium)
    }
    
    func layout() {
        addSubview(contentLabel)
        contentLabel.snp.makeConstraints {
            $0.edges.equalToSuperview().inset(16.0)
        }
    }
}
profile
iOS Developer 🐢

0개의 댓글