Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- uiscrollview
- 클린 코드
- UICollectionView
- 리펙토링
- swiftUI
- swift documentation
- HIG
- Human interface guide
- map
- 리펙터링
- Observable
- collectionview
- 스위프트
- RxCocoa
- uitableview
- Xcode
- Clean Code
- Refactoring
- SWIFT
- ribs
- clean architecture
- tableView
- 리팩토링
- combine
- MVVM
- 애니메이션
- ios
- Protocol
- rxswift
- UITextView
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] UITableView, UICollectionView에서의 isHighlighted와 isSelected 동작 주의사항 본문
iOS 응용 (swift)
[iOS - swift] UITableView, UICollectionView에서의 isHighlighted와 isSelected 동작 주의사항
jake-kim 2024. 6. 5. 01:31UITableViewCell과 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를 사용할 것
'iOS 응용 (swift)' 카테고리의 다른 글
Comments