UIKIT

이미지 선택한 갯수 표시 및 최대치 도달시 알림창 띄우기

밤새는 탐험가89 2024. 11. 25. 02:22

구현 내용

 

  • 최대 선택가능한 이미지 갯수는 5장 입니다. 
  • 사진을 선택할 경우, 선택한 이미지 갯수 / 최대 선택 가능한 이미지 갯수로 표시됩니다. 
  • 만약에 선택한 이미지 갯수가 5개로 도달하면, 자동으로 이미지 선택 창이 닫힙니다. 
  • 다시 이미지 선택 버튼을 누를 경우 경고창이 뜹니다. 

 

구현 방법 

  • 선택된 이미지 갯수를 할당할 변수 선언 
  • 최대 선택 가능한 이미지 갯수를 할당할 변수 선언 
  • presentImagePicker() 메서드 내에 if 조건문을 통해 조건 별 상황 부여 
  • 선택한 이미지 갯수에 따라, 최대 선택가능한 이미지 개수를 조절

 

변수 선언

    var selectedImagesCount: Int = 0
    var selectedMaxImage: Int = 5

 

 

이미지 선택을 완료한 후 각 변수에 결과를 할당 -> picker()

if 구문을 통해 상황 통제 -> presentImagePicker()

// MARK: - extension PHPickerViewControllerDelegate
extension FeedViewController: PHPickerViewControllerDelegate {
    
    /// 갤러리 창을 띄워 이미지를 선택할 수 있도록 해주는 함수
    private func presentImagePicker() {
  
        var configuration = PHPickerConfiguration()
        configuration.filter = .any(of: [.images])   // 이미지 선택 가능
        configuration.selection = .ordered    // 순서 보장
        
        configuration.preferredAssetRepresentationMode = .automatic
        
        /* 선택가능한 사진 수를 채운 뒤에도 버튼을 누를 경우 경고창 띄움 */
        
        if self.selectedImagesCount == 0 {
            configuration.selectionLimit = selectedMaxImage
            
            let picker = PHPickerViewController(configuration: configuration)
            picker.delegate = self
            present(picker, animated: true)
        } else if self.selectedImagesCount != 0 && self.selectedImagesCount < selectedMaxImage {
            configuration.selectionLimit = selectedMaxImage - self.selectedImagesCount
            let picker = PHPickerViewController(configuration: configuration)
            picker.delegate = self
            present(picker, animated: true)
        } else {
            let alert = UIAlertController(title: "알림", message: "선택할 수 있는 사진 수를 넘기셨어요 😅", preferredStyle: .alert)
            let confirm = UIAlertAction(title: "확인", style: .default)
            let close = UIAlertAction(title: "닫기", style: .destructive)
            
            alert.addAction(confirm)
            alert.addAction(close)
            self.present(alert, animated: true)
        }
    }
    
    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
        picker.dismiss(animated: true)
        
        for item in results {
            // itemProvider로 이미지를 로드
            item.itemProvider.loadObject(ofClass: UIImage.self) { [weak self] (image, error) in
                guard let self = self else { return }
                
                if let image = image as? UIImage {
                    // 이미지를 로드한 경우
                    DispatchQueue.main.async {
                        print("Selected image: \(image)")
                        self.selectedImages.append(image)
                        self.selectedImagesCount = self.selectedImages.count
                        self.feedView.imageCounts = self.selectedImagesCount
                        self.feedView.updateButtonSubtitle()
                        
                        if self.selectedImages.count <= 5 {
                            self.feedView.selectedImageCollectionView.reloadData()
                        }
                    }
                } else if let error = error {
                    print("Error loading image: \(error.localizedDescription)")
                }
            }
        }
    }
}

 

 

FeedView 내의 selectedButton의 subTitle 문구 업데이트

    /// 이미지 선택하는 버튼 아래에 SubTitle 설정하는 함수 
    func updateButtonSubtitle() {
        var updatedConfig = selectedButton.configuration
        updatedConfig?.subtitle = "\(self.imageCounts) / 5"
        selectedButton.configuration = updatedConfig
    }

 

 

🔥 self.feedView.selectedButton.subtitleLabel?.text = "\(self.selectedImages.count) / 5 왜 이건 안될까?

 

버튼의 subtitle을 이미지 선택 수에 맞게 업데이트하는 코드를 수정 및 추가할 수 있습니다.

문제는 UIButton.Configuration에서 subtitle은 버튼 생성 시에는 설정 가능하지만, 이후 업데이트하려면 configuration을 다시 설정해야 한다는 점입니다.

 

/// 이미지를 선택한 수를 버튼 subtitle에 업데이트하는 메서드
func updateButtonSubtitle() {
    var updatedConfig = selectedButton.configuration
    updatedConfig?.subtitle = "\(imageCounts) / 5"
    selectedButton.configuration = updatedConfig
}

// ... 초기화 부분에서 selectedButton subtitle 업데이트 ...
override init(frame: CGRect) {
    super.init(frame: frame)
    backgroundColor = .systemOrange
	...
    // 초기 subtitle 설정
    updateButtonSubtitle()
}