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()
}
}
'아이폰 개발 > Swift' 카테고리의 다른 글
swift AutoLayout 2 - ContainerView와 NSMutableAttributedString (0) | 2021.03.29 |
---|---|
swift AutoLayout 1 - 소개 (0) | 2021.03.29 |
swift coredata - feat : tableView storyBoard 코드로 띄우기 (0) | 2021.03.27 |
swift 프로퍼티 리스트 - feat: pickerView & tableView (0) | 2021.03.26 |
swift - alert 커스터마이징 feat: 지도, 이미지, 테이블뷰, 슬라이더 (1) | 2021.03.25 |