관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] UITableView, UICollectionView에서의 isHighlighted와 isSelected 동작 주의사항 본문

iOS 응용 (swift)

[iOS - swift] UITableView, UICollectionView에서의 isHighlighted와 isSelected 동작 주의사항

jake-kim 2024. 6. 5. 01:31

UITableViewCell과 UICollectionViewCell

  • UITableViewCell과 UICollectionViewCell은 각각 반복되는 여러 데이터를 화면에 보이는 지점만 렌더링하여(cellForRowAt, cellForItemAt) 효율적으로 뷰를 그릴 수 있는 인터페이스
UITableViewCell UICollectionViewCell
  • 각 커스텀 셀을 구현할 때 비슷한 구조를 가지고 있음

ex) tableViewCell 구현

class CustomTableViewCell: UITableViewCell {
    let titleLabel = UILabel()
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
         super.init(style: style, reuseIdentifier: reuseIdentifier)
         setupUI()
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func setupUI() {
        titleLabel.translatesAutoresizingMaskIntoConstraints = false
        contentView.addSubview(titleLabel)
        NSLayoutConstraint.activate([
            titleLabel.centerYAnchor.constraint(equalTo: contentView.centerYAnchor),
            titleLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 20)
        ])
    }

    func configure(with title: String) {
        titleLabel.text = title
    }
}

 

ex) collectionViewCell 구현

class CustomCell: UICollectionViewCell {
    var label: UILabel!
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 50))
        label.textAlignment = .center
        label.textColor = .black
        contentView.addSubview(label)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

주의사항

  • 비슷한 구조를 가지고 있어서 두 개 모두 동작이 유사할것 같지만, isHighlighted와 isSelected 상태가 다름을 주의
    • UITableViewCell은 isHighlighted와 isSelected 프로퍼티가 최초에 한번만 false로 초기화 됨 (셀을 그리는 시점인 cellForRowAt에 초기화됨)
    • UICollectionViewCell은 셀을 탭할 때 isHighlighted와 isSelected 값이 변경됨

ex) isHighlighted와 isSelected 프로퍼티를 override하여 출력하는 코드와 색상을 변경하는 코드를 적용하여 테스트

class CustomTableViewCell: UITableViewCell {
    override var isHighlighted: Bool {
        didSet {
            print("isHighlighted>", isHighlighted)
        }
    }
    
    override var isSelected: Bool {
        didSet {
            print("isSelected>", isSelected)
            contentView.backgroundColor = isSelected ? .green : .white
        }
    }

    ...
}

class CustomCell: UICollectionViewCell {
    override var isHighlighted: Bool {
        didSet {
            print("isHighlighted>", isHighlighted)
        }
    }
    
    override var isSelected: Bool {
        didSet {
            print("isSelected>", isSelected)
            contentView.backgroundColor = isSelected ? .green : .white
        }
    }
    
   ...
}
UITableViewCell UICollectionViewCell
  • 결과)
    • UITableViewCell은 isHighlighted와 isSelected 프로퍼티가 최초에 한번만 false로 초기화 됨 (셀을 그리는 시점인 cellForRowAt에 초기화됨)
    • UICollectionViewCell은 셀을 탭할 때 isHighlighted와 isSelected 값이 변경됨
    • isHighlighted, isSelected 이벤트를 별다른 처리 없이 얻고싶을땐 UICollectionView를 사용할 것
Comments