꾸준히 안타치기

② 프로필 화면 / 프사눌러 이미지 변경하기 본문

iOS/기본편 | 실전편 -꼼꼼한재은씨

② 프로필 화면 / 프사눌러 이미지 변경하기

글자줍기 2022. 2. 18. 17:44
반응형

기본 프로필 이미지 터치 -> profile() -> imgPicker()호출 ->imagePickerController()실행->  앨범에서 선택 or 카메라 사용 -> 이미지  UserDefault에 저장 / 이미지뷰에 적용

이미지 피커 컨트롤러를 사용하기 위해 ProfileVC클래스에 프로토콜을 추가한다.

ProfileVC. swift

class ProfileVC: UIViewController, UITableViewDelegate, UITableViewDataSource, UIImagePickerControllerDelegate,
UINavigationControllerDelegate {

이미지 피커 컨트롤러를 실행할 커스텀 메소드 imgPicker(_:)를 정의한다.

매개변수를 정의하고, 이 매개변수를 통해 이미지를 가져올 소스타입을 지정할 수 있도록 구현한다.

  // 이미지 피커
    func imgPicker(_ source : UIImagePickerController.SourceType){
        let picker = UIImagePickerController()
        picker.sourceType = source
        picker.delegate = self
        picker.allowsEditing = true
        self.present(picker, animated: true)
    }

Profile()메소드를 정의한다. 메소드 호출시 액션시트 나타내기

- 비로그인 상태에서는 프로필 이미지가 등록되지 않도록 처리한다. 비로그인상태에서는 로그인창이 뜨고 로그인이 되어있을때에만 액션시트가 뜨도록한다.

  // 프로필사진의 소스 타입을 선택하는 액션 메소드
    @objc func profile(_ sender : UIButton){
        // 로그인되어 있지 않을 경우에는 프로필 이미지 등록을 막고 대신 로그인 창을 띄워준다.
        // 계정이 널이 아닌게 아니면? / 로그인창을 띄워준다.
        guard self.uinfo.account != nil else {
            self.doLogin(self)
            return
        }
        
        let alert = UIAlertController(title: nil, message: "사진을 가져올 곳을 선택해주세요",
        preferredStyle: .actionSheet)
        
        // 카메라를 사용할 수 있으면
        if UIImagePickerController.isSourceTypeAvailable(.camera){
            alert.addAction(UIAlertAction(title: "카메라", style: .default) { (_) in
                self.imgPicker(.camera)
            })
        }
        
        // 저장된 앨범을 사용할 수 있으면
        if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum){
            alert.addAction(UIAlertAction(title: "저장된앨범", style: .default) { (_) in
                self.imgPicker(.savedPhotosAlbum)
            })
        }
        // 포토라이브러리를 사용할 수 있으면
        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){
            alert.addAction(UIAlertAction(title: "포토라이브러리", style: .default) { (_) in
                self.imgPicker(.photoLibrary)
            })
        }
        // 취소버튼 추가
        alert.addAction(UIAlertAction(title: "취소", style: .cancel, handler: nil))
        
        //액션시트 창 실행
        self.present(alert, animated: true)
    }

선택한 이미지를 전달 받아 프로필사진으로 등록할 메소드를 구현합니다.

  // 선택한 이미지를 전달받아 프로필 사진으로 등록할 메소드
    // 이미지를 선택하면 이 메소드가 자동으로 호출된다.
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let img = info[UIImagePickerController.InfoKey.editedImage] as? UIImage {
            self.uinfo.profile = img // 프로필이미지를 uinfo에 저장
            self.profileImage.image = img //이미지를 이미지뷰에 설정
        }
        // 이미지 피커 컨트롤러 창 닫기!! 안해주면 안닫힘
        picker.dismiss(animated: true)
    }

프로필 이미지뷰 객체에 탭 제스처를 등록하고, 이를 Profile()메소드에 연결한다.

override func viewDidLoad(){
 // 프로필이미지 객체에 탭 제스처를 등록하고, 이를 프로필메소드와 연결한다.*********************************************
        let tap = UITapGestureRecognizer(target: self, action: #selector(profile(_:)))
        self.profileImage.addGestureRecognizer(tap)
        self.profileImage.isUserInteractionEnabled = true //상호반응허락
}

사이드바의 프로필영역에 저장데이터 적용하기

SideBarVC 클래스에  UserInfoManager 타입의 멤버 상수를 선언하고, 이를 초기화 한다.

import UIKit

class SideBarVC: UITableViewController {

    let uinfo = UserInfoManager() //개인정보관리매니저

 viewDidLoad()에 작성되어 있는 이름과, 이메일, 프로필사진 더미텍스트를 지우고 viewVillApper에  사이드바가 화면에 표시될때 마다 로그인 정보를 읽어와 갱신하도록 작성한다.

    //사이드바가 화면에 표시될 때마다 로그인 정보를 읽어와 갱신하도록 다음과 같이 작성
    override func viewWillAppear(_ animated: Bool) {
        self.nameLabel.text = self.uinfo.name ?? "Guest"
        self.emailLabel.text = self.uinfo.account ?? ""
        self.profileImage.image = self.uinfo.profile
    }

 

반응형
Comments