저번 글에서 언급했듯이 Diary에 Image를 추가를 했습니다.
이번 글을 꽤 간단한 구현을 다루고 있기 때문에 짧게 끝날 것 같습니다.
1. CreateVC에 ImageView 추가 & 버튼 추가
2. Diary에 Image를 담을 프로퍼티 생성 & DiaryListMV init 함수 변경
ImageView와 버튼을 추가했습니다. 이미지 추가 버튼을 누르면 갤러리가 등장하고 사진을 선택하면 미리보기로 ImageView에 띄워주는 기능을 구현하도록 하겠습니다.
위와 같이 갤러리에서 사진을 선택하려면 또다른 새로운 컨트롤러로 넘어가야합니다.
그 컨트롤러의 이름은 UIImagePickerController 입니다.
이 컨트롤러를 사용하기 위해서는 VC가 UIImagePickerControllerDelegate, UINavigationControllerDelegate 이 두가지를 상속받아야합니다.
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var imgInsertBtn: UIButton!
let imgPicker = UIImagePickerController()
override func viewDidLoad() {
super.viewDidLoad()
self.imgPicker.sourceType = .photoLibrary
self.imgPicker.allowsEditing = true
self.imgPicker.delegate = self
}
먼저 UIImagePickerController를 전역으로 선언했습니다.
self.imgPicker.sourceType = .photoLibrary //imagePicker의 소스 타입은 photo 라이브러리에서 가져오는 것.
self.imgPicker.allowsEditing = true //이미지를 가져오기 전에 이미지 편집 허용 (예시로 허용함)
self.imgPicker.delegate = self //imagePicker의 역할을 이 클래스에 위임
@IBAction func imgInsertBtnPushed(_ sender: Any) {
imageView.isHidden = false
imgInsertBtn.isHidden = true
present(imgPicker, animated: true)
}
이미지 추가 버튼을 눌렀을 때 ImageVIew는 보이고 버튼은 사라지게 만든 후 ImagePicker를 보여주는 액션입니다.
extension CreateViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate{
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let img = info[UIImagePickerController.InfoKey.originalImage] as? UIImage{
imageView.contentMode = .scaleAspectFit
imageView.image = img
}
dismiss(animated: true)
}
}
UIImagePickerControllerDelegate, UINavigationControllerDelegate의 상속과 필요한 오버라이드 입니다.
imageView.image = img //imageView의 이미지를 가져온 이미지로 설정
public struct Diary{
let date:Date
let emotion:String?
let content:String
let imageData:Data?
init(date:Date, emotion:String?, content:String, imageData:Data?){
self.date = date
self.emotion = emotion
self.content = content
self.imageData = imageData
}
}
이미지를 리스트에 저장시켰을 때 타입은 Data? 입니다. 따라서 imageData를 Data 타입으로 추가했습니다.
뷰 모델도 그와 맞게 변경했습니다.
class DiaryListViewModel: NSObject{
var diary: Diary!
var diaryList: [Diary]!
override init() {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
diaryList = []
}
func createDiaryData(date:Date, emotion: String?, content: String, imageData:Data?){
diary = Diary(date: date, emotion: emotion, content: content, imageData: imageData)
print("DiaryList appended ( \(date), \(content) ) in DiaryCreateViewModel")
diaryList.append(diary)
}
func deleteDiaryData(index:Int){
print("DiaryList delete index \(index)")
diaryList.remove(at:index)
}
}
...
@IBAction func completeButtonPushed(_ sender: UIButton) {
...
let imageData = self.imageView.image?.pngData()
dataDelegate?.receiveData(date:date, emotion:emotion, content:content, doCalendar: doCalendar, imageData: imageData)
dismiss(animated: true)
}
...
UIImage(data: imageData)
로 다시 변경 가능합니다.
(이미지 비율이 맞지 않음..)
보면서 느낀 점이 UI가 엉망이라는 느낌이 들었습니다. 아직은 UI 디자인이 쉽지 않은 것 같습니다. AutoLayout이라던지 다른 어플을 참고하던지 해서 UI를 개선하도록 노력해야겠네요..