본문 바로가기
아이폰 개발/Swift

swift - 회원가입화면 예제 feat : pickerViewController + 인디케이터 + 이미지처리

by 인생여희 2021. 3. 27.

swift - 회원가입화면 예제 feat : pickerViewController + 인디케이터 + 이미지처리

 

 

완성된 화면

 

스토리보드

 

 

 

 

코드

 

import Foundation
import UIKit

//테이블뷰 + 이미지픽커뷰 컨트롤러 프로토콜 채택
class JoinVC :UIViewController,UITableViewDelegate, UITableViewDataSource , UINavigationControllerDelegate , UIImagePickerControllerDelegate {
   
    // API 호출 상태 값
    var isCalling = false
    
    //텍스트 뷰에 들어갈 텍스트 필드
    //계정 필드
    var fieldAccount: UITextField!
    //암호 필드
    var fieldPassword: UITextField!
    //이름 필드
    var fieldName : UITextField!
    
    //테이블 뷰
    @IBOutlet weak var tableView: UITableView!
    
    //이미지 뷰
    @IBOutlet weak var profile: UIImageView!
    
    //인디케이터 뷰
    @IBOutlet weak var indicatorView: UIActivityIndicatorView!
    
    override func viewDidLoad() {
        //1.델리게이트 프로토콜이 구현되어 있는 객체를 delegate 속성을 통해 참조하고
        //델리게이트 메서드를 찾아서 호출하기 위함
        self.tableView.dataSource = self
        self.tableView.delegate = self
        
        //2.프로필 이미지를 원형으로 표현
        self.profile.layer.cornerRadius = self.profile.frame.width / 2
        self.profile.layer.masksToBounds = true
        
        //3.프로필 이미지에 제스쳐, 액션 이벤트 설정
        let gesture = UITapGestureRecognizer(target: self, action: #selector(tappedProfile(_:)))
        self.profile.addGestureRecognizer(gesture)
        
        
        //4.인디케이터 뷰를 맨 앞으로
        self.view.bringSubviewToFront(self.indicatorView)
        
    }
    
    //이미지 클릭시 액션 이벤트
    @objc func tappedProfile(_ sender : Any) {
        //액션 시트
        
        let msg = "프로필 이미지를 가져올 곳을 선택하세요"
        
        let sheet = UIAlertController(title: msg, message: nil, preferredStyle: .actionSheet)
        
        sheet.addAction(UIAlertAction(title: "취소", style: .cancel, handler: nil))
        sheet.addAction(UIAlertAction(title: "저장된 앨범", style: .default, handler: { (_) in
            
            //이미지 피커창 호출
            selectLibary(src: .savedPhotosAlbum)
        }))
        
        sheet.addAction(UIAlertAction(title: "포토 라이브러리", style: .default, handler: { (_) in
            //이미지 피커창 호출
            selectLibary(src: .photoLibrary)
        }))
        
        sheet.addAction(UIAlertAction(title: "카메라", style: .default, handler: { (_) in
            //이미지 피커창 호출
            selectLibary(src: .camera)
        }))
        
        self.present(sheet, animated: false, completion: nil)
        
        
        //이미지 피커창 호출
        func selectLibary(src:UIImagePickerController.SourceType){
            
            if UIImagePickerController.isSourceTypeAvailable(src){
                
                let picker = UIImagePickerController()
                picker.delegate = self
                picker.allowsEditing = true
                
                self.present(picker, animated: false, completion: nil)
            }else{
                self.alert("사용할 수 없는 타입입니다.")
            }
            
        }
    }

    //이미지를 선택하면 호출되는 델리게이트 메서드 구현
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        
        if let img = info[UIImagePickerController.InfoKey.originalImage] as? UIImage{
            self.profile.image = img
        }
        

        //매개변수 info는 딕셔너리 형태로 키-값을 통해 다양한 이미지 정보를 얻을 수 있습니다.
        //원본 이미지는 UIImagePickerController.InfoKey.originalImage키로 얻습니다.
        self.dismiss(animated: true, completion: nil)
    }
    
    //개수
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }
    
    //cell 구성
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
        let tfFrame = CGRect(x: 20, y: 0, width: cell.bounds.width - 20, height: 37)
        
        switch indexPath.row {
        case 0:
            
            self.fieldAccount = UITextField(frame: tfFrame)
            self.fieldAccount.placeholder = "계정(이메일)"
            self.fieldAccount.borderStyle = .none
            self.fieldAccount.autocapitalizationType = .none
            self.fieldAccount.font = UIFont.systemFont(ofSize: 14)
            cell.addSubview(self.fieldAccount)
            
        case 1:
            
            self.fieldPassword = UITextField(frame: tfFrame)
            self.fieldPassword.placeholder = "비밀번호"
            self.fieldPassword.borderStyle = .none
            self.fieldPassword.isSecureTextEntry = true
            self.fieldPassword.font = UIFont.systemFont(ofSize: 14)
            cell.addSubview(self.fieldPassword)
            
        case 2:
            self.fieldName = UITextField(frame: tfFrame)
            self.fieldName.placeholder = "이름"
            self.fieldName.borderStyle = .none
            self.fieldName.font = UIFont.systemFont(ofSize: 14)
            cell.addSubview(self.fieldName)
        default:
            ()
        }
        
        return cell
        
    }

    //셀의 높이 설정
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 40
    }

    @IBAction func saveAction(_ sender: Any) {
        print("저장2")
        
        if self.isCalling == true {
            self.alert("진행중입니다. 잠시만 기다려주세요")
            return
        }else{
            self.isCalling = true
        }
        
        //인디케이터 뷰 애니메이션 실행
        self.indicatorView.startAnimating()
        
        //전송할 값 준비
        //이미지 처리 (Base64 인코딩)
        let profile = UIImage.pngData(self.profile.image!)()?.base64EncodedString()
        
        //전송할 값을 Parameters 타입의 객체로 정의
        
        //let param : Parameter
        
        self.indicatorView.stopAnimating()
    }
    

}

 

 

 

LoginTest.zip
0.05MB