UICollectionView 의 보여줄 내용이 없거나, 네트워크 등의 에러로 리스트에 보여줄 수 없을 경우
휑~~하니 흰색바탕화면만 나타나면 썰렁해서 UICollectionView 백그라운드에 이미지와 메세지를 추가해준다.
Extention 으로 구현해서 사용하면 된다.
enum alertImageType {
case check, congratulation, nothing, shoot, sorry, success, sure
var identifier: String {
switch self {
case .check: return "alert_check"
case .congratulation: return "alert_congratulation"
case .nothing: return "alert_nothing"
case .shoot: return "alert_shoot"
case .sorry: return "alert_sorry"
case .success: return "alert_success"
case .sure: return "alert_sure"
}
}
}
enum EmptyMessage {
case NetworkCheck
case NetworkError
case ListEmpty
var message: String {
switch self {
case .NetworkCheck: return "네트워크 상태를 체크해주세요."
case .NetworkError: return "네트워크 상태를 체크해주세요."
case .ListEmpty: return "등록된 내용이 없습니다."
}
}
}
extension UICollectionView {
// Empty Message Add
func setEmptyMessage(image type:alertImageType, _ message: String = "", fontSize: CGFloat = 14.0) {
if isEmptyMessageVisible() == true {
self.backgroundView = nil
}
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFit
imageView.image = UIImage(named: type.identifier) //UIImage로 이미지 불러와서 사용하면됨.
let messageLabel = UILabel()
messageLabel.text = message
messageLabel.font = UIFont.notoSansFont(forFont: .NotoSansCJKkrMedium, size: fontSize)
messageLabel.textColor = .gray
messageLabel.numberOfLines = 0
messageLabel.textAlignment = .center
messageLabel.sizeToFit()
let mainView = UIView()
mainView.addSubview(imageView)
mainView.addSubview(messageLabel)
// 이미지보다 컬렉션뷰가 작을 경우
if (imageView.image?.size.height)! > self.frame.height {
imageView.image = resizeImage(image: imageView.image!, newWidth: self.frame.height - 40)
}
//Auto Layout
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.centerXAnchor.constraint(equalTo: mainView.centerXAnchor).isActive = true
imageView.centerYAnchor.constraint(equalTo: mainView.centerYAnchor , constant: -20).isActive = true //-40
messageLabel.translatesAutoresizingMaskIntoConstraints = false
messageLabel.topAnchor.constraint(equalTo: imageView.bottomAnchor, constant: 10).isActive = true //20
messageLabel.leadingAnchor.constraint(equalTo: mainView.leadingAnchor, constant: 10).isActive = true
messageLabel.trailingAnchor.constraint(equalTo: mainView.trailingAnchor, constant: 10).isActive = true
self.backgroundView = mainView
}
private func isEmptyMessageVisible() -> Bool {
if self.backgroundView != nil {
return true
}
return false
}
// Empty Message Relese
private func restoreBackgroundView() {
self.backgroundView = nil
}
private func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage? {
let scale = newWidth / image.size.width // 새 이미지 확대/축소 비율
let newHeight = image.size.height * scale
UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
}
사용방법
/// 결과값이 잘못됬을 경우 아래 한줄로 표시하면됨.
if result == nil {
collectionView.setEmptyMessage(image: .sorry, "보여주고 싶은 메세지")
}
'Swift > UICollectionView' 카테고리의 다른 글
[SWIFT]UICollectionView register 단순화 하기 (0) | 2023.06.15 |
---|---|
[SWIFT]UICollectionViewCell Extention IndexPath 구하기 (0) | 2023.04.26 |
[SWIFT]UICellectionView RefreshControl 추가하기 (0) | 2023.04.26 |
[SWIFT]현재 화면 중앙에 보여지고 있는 Cell의 IndexPath가져오기 (0) | 2023.04.26 |
[SWIFT]register / dequeueReusableCell 편하게 사용하기 (0) | 2023.04.26 |