Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
190 changes: 99 additions & 91 deletions Pinit/Pinit/Views/PinEdit/PinEditViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,77 +9,63 @@ import UIKit
import MapKit
import SnapKit

enum PinMode {
case create(latitude: Double, longtitude: Double)
case edit
}

final class PinEditViewController: UIViewController, UITextViewDelegate {

private var mapView: MKMapView! //mapview 불러옴
private let datebutton = UIButton() // leftbutton을 클래스 프로퍼티로 변경
private var mapView: MKMapView!
private let pinmode: PinMode = .edit

override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .white

view.backgroundColor = .white

switch pinmode {
case let .create(latitude, longtitude):
print("\(latitude), \(longtitude)")
case .edit:
print("편집 모드입니다")
}

//MARK: mapView 설정
mapView = MKMapView(frame: self.view.bounds) //mkmapview 초기화 및 뷰 추가함
mapView = MKMapView(frame: CGRect(x: 0, y: 60, width: self.view.bounds.width, height: self.view.bounds.height / 4)) //화면의 1/4만 나오게 함

self.view.addSubview(mapView) //mapview 뷰에 보이게

setUpKeyboard()

let center = CLLocationCoordinate2D(latitude: 37.506446, longitude: 126.885397) //중심좌표
let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05))
mapView.setRegion(region, animated: true)


// 지도 오른쪽 위에 닫기 버튼 추가, xmark.circle.fill
let closeButton = UIButton(type: .system)
//MARK: 지도 오른쪽 위에 닫기 버튼 추가, xmark.circle.fill
if let closeImage = UIImage(systemName: "xmark.circle.fill") {
let largeConfig = UIImage.SymbolConfiguration(pointSize: 45, weight: .bold, scale: .default)
let largeImage = closeImage.withConfiguration(largeConfig)
closeButton.setImage(largeImage, for: .normal)
}
closeButton.tintColor = .black
closeButton.alpha = 0.7 // 투명도 50% 설정
closeButton.addTarget(self, action: #selector(dismissButtonTapped), for: .touchUpInside)

self.view.addSubview(closeButton)

// Auto Layout 설정
closeButton.snp.makeConstraints {
$0.top.equalToSuperview().offset(65) // 상단에서 65포인트
$0.trailing.equalToSuperview().offset(-5) // 오른쪽에서 5
$0.width.height.equalTo(40) // 버튼 크기
}

//왼쪽 기록 날짜 버튼
//MARK: 왼쪽 기록 날짜 버튼
datebutton.backgroundColor = .clear
datebutton.layer.cornerRadius = 10
datebutton.setTitle("3월 17일", for: .normal) //for: .normal은 아무런 상호작용 없을때 상태
self.view.addSubview(datebutton) //뷰에 leftbutton 보여줌
datebutton.setTitleColor(UIColor.black, for: .normal) // 글자색을 검은색으로 변경

//오토레이아웃 설정
datebutton.snp.makeConstraints{
$0.leading.equalToSuperview().offset(10) //왼쪽에서 10 떨어짐
$0.top.equalToSuperview().offset(300) //탑에서 300
$0.width.equalTo(180) //너비 200
$0.height.equalTo(30) //높이 30
}

//오른쪽 날씨 버튼
let weatherbutton = UIButton()
//MARK: 오른쪽 날씨 버튼
weatherbutton.layer.cornerRadius = 10
weatherbutton.setTitle("맑음", for: .normal)
weatherbutton.setTitleColor(UIColor.black, for: .normal) // 글자색을 검은색으로 변경
self.view.addSubview(weatherbutton)

//오토레이아웃 설정
weatherbutton.snp.makeConstraints{
$0.leading.equalToSuperview().offset(210)
$0.top.equalToSuperview().offset(300)
$0.width.equalTo(180)
$0.height.equalTo(30)
}

//그 아래 카메라 버튼
let camerabutton = UIButton()

//MARK: 아래 카메라 버튼
camerabutton.backgroundColor = .white
camerabutton.layer.cornerRadius = 75
camerabutton.layer.shadowColor = UIColor.black.cgColor // 색깔
Expand All @@ -97,22 +83,7 @@ final class PinEditViewController: UIViewController, UITextViewDelegate {

camerabutton.addTarget(self, action: #selector(cameraButtonTapped), for: .touchUpInside)

self.view.addSubview(camerabutton)
//사진 배경 흰색, 안에 아이콘을 검은색

// Auto Layout 설정
camerabutton.snp.makeConstraints{
$0.centerX.equalToSuperview()
$0.centerY.equalToSuperview()
$0.width.equalTo(150)
$0.height.equalTo(150)

}

// 배경 흰색, stroke를 회색
// 제목 작성 버튼
let titlefield = UITextField()
titlefield.backgroundColor = .white
//MARK: 제목 작성 버튼
titlefield.layer.borderColor = UIColor(red: 169/255, green: 169/255, blue: 169/255, alpha: 1).cgColor // #A9A9A9 (다크 라이트 그레이)
titlefield.layer.borderWidth = 2 // 테두리 두께 설정
titlefield.textColor = .black
Expand All @@ -126,17 +97,7 @@ final class PinEditViewController: UIViewController, UITextViewDelegate {
titlefield.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 16, height: 0)) // 이거 개쩜 제목 작성 맨 앞에 여백을 주는거임
titlefield.leftViewMode = .always //항상

self.view.addSubview(titlefield)

titlefield.snp.makeConstraints{
$0.leading.equalToSuperview().offset(20)
$0.top.equalToSuperview().offset(540)
$0.width.equalTo(360)
$0.height.equalTo(40)
}

// 추가메모 텍스트뷰 추가
let contentTextView = UITextView()
//MARK: 추가메모 텍스트뷰 추가
contentTextView.backgroundColor = .white
contentTextView.layer.borderColor = UIColor(red: 169/255, green: 169/255, blue: 169/255, alpha: 1).cgColor // #A9A9A9 (다크 라이트 그레이)
contentTextView.layer.borderWidth = 2 // 테두리 두께 설정
Expand All @@ -145,34 +106,17 @@ final class PinEditViewController: UIViewController, UITextViewDelegate {
contentTextView.textAlignment = .center
contentTextView.textColor = UIColor.black
contentTextView.font = UIFont.systemFont(ofSize: 16)
self.view.addSubview(contentTextView)

contentTextView.snp.makeConstraints {
$0.leading.equalToSuperview().offset(20)
$0.top.equalTo(titlefield.snp.bottom).offset(10)
$0.width.equalTo(360)
$0.height.equalTo(150)
}

contentTextView.delegate = self

//저장 버튼
let savebutton = UIButton()
//MARK: 저장 버튼
savebutton.backgroundColor = UIColor(red: 28/255, green: 70/255, blue: 245/255, alpha: 1) // #FF8C42 (딥 오렌지)
savebutton.setTitle("저장", for: .normal)
savebutton.layer.cornerRadius = 10
self.view.addSubview(savebutton)

//오토레이아웃 설정
savebutton.snp.makeConstraints{
$0.leading.equalToSuperview().offset(130)
$0.top.equalToSuperview().offset(760)
$0.width.equalTo(150)
$0.height.equalTo(55)
}
setui()


//키보드 완료 버튼
//MARK: 키보드 완료 버튼
let keyboardToolbar = UIToolbar()
let flexBarButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let doneBarButton = UIBarButtonItem(title: "완료", style: .plain, target: self, action: #selector(doneBtnClicked))
Expand All @@ -184,28 +128,82 @@ final class PinEditViewController: UIViewController, UITextViewDelegate {

}

//MARK: 오토레이아웃 정리
let savebutton = UIButton()
let contentTextView = UITextView()
let titlefield = UITextField()
let camerabutton = UIButton()
let weatherbutton = UIButton()
private let datebutton = UIButton()
let closeButton = UIButton(type: .system)
func setui() {
self.view.addSubviews(savebutton, contentTextView, titlefield, camerabutton, weatherbutton, datebutton, closeButton)

savebutton.snp.makeConstraints{
$0.leading.equalToSuperview().offset(130)
$0.top.equalToSuperview().offset(760)
$0.width.equalTo(150)
$0.height.equalTo(55)
}
contentTextView.snp.makeConstraints {
$0.leading.equalToSuperview().offset(20)
$0.top.equalTo(titlefield.snp.bottom).offset(10)
$0.width.equalTo(360)
$0.height.equalTo(150)
}
titlefield.snp.makeConstraints{
$0.leading.equalToSuperview().offset(20)
$0.top.equalToSuperview().offset(540)
$0.width.equalTo(360)
$0.height.equalTo(40)
}
camerabutton.snp.makeConstraints{
$0.centerX.equalToSuperview()
$0.centerY.equalToSuperview()
$0.width.equalTo(150)
$0.height.equalTo(150)
}
weatherbutton.snp.makeConstraints{
$0.leading.equalToSuperview().offset(210)
$0.top.equalToSuperview().offset(300)
$0.width.equalTo(180)
$0.height.equalTo(30)
}
datebutton.snp.makeConstraints{
$0.leading.equalToSuperview().offset(10)
$0.top.equalToSuperview().offset(300)
$0.width.equalTo(180)
$0.height.equalTo(30)
}
closeButton.snp.makeConstraints {
$0.top.equalToSuperview().offset(65)
$0.trailing.equalToSuperview().offset(-5)
$0.width.height.equalTo(40)
}
}

//MARK: 키보드 닫기
@objc func doneBtnClicked() {
view.endEditing(true) // 키보드 닫기
view.endEditing(true)
}

//MARK: 카메라 선택, 사진 선택
@objc func cameraButtonTapped() {
let actionSheet = UIAlertController(title: "사진 선택", message: "사진을 가져올 방법을 선택하세요.", preferredStyle: .actionSheet)

let cameraAction = UIAlertAction(title: "카메라", style: .default) { _ in
self.presentImagePicker(sourceType: .camera)
}
let galleryAction = UIAlertAction(title: "갤러리", style: .default) { _ in
self.presentImagePicker(sourceType: .photoLibrary)
}
let cancelAction = UIAlertAction(title: "취소", style: .cancel, handler: nil)

actionSheet.addAction(cameraAction)
actionSheet.addAction(galleryAction)
actionSheet.addAction(cancelAction)

present(actionSheet, animated: true, completion: nil)
}

//MARK: 사진 선택하면 화면에 사진 띄우기
func presentImagePicker(sourceType: UIImagePickerController.SourceType) {
guard UIImagePickerController.isSourceTypeAvailable(sourceType) else { return }

Expand All @@ -217,6 +215,7 @@ final class PinEditViewController: UIViewController, UITextViewDelegate {
present(imagePicker, animated: true, completion: nil)
}

//MARK: 시스템에 알리는 키보드 상태 알림
func setUpKeyboard() {
NotificationCenter.default.addObserver(self,
selector: #selector(keyboardWillShow),
Expand All @@ -228,21 +227,29 @@ final class PinEditViewController: UIViewController, UITextViewDelegate {
object: nil)
}

@objc func dismissButtonTapped() {
self.dismiss(animated: true)
}

//MARK: 키보드가 나타낼때 화면을 -300
@objc func keyboardWillShow(notification: NSNotification) {
view.frame.origin.y = -300 //키보드가 나타날 때 동작
view.frame.origin.y = -300
}

//MARK: 키보드가 사라질 때 동작
@objc func keyboardWillHide(notification: NSNotification) {
view.frame.origin.y = 0 //키보드가 사라질 때 동작
view.frame.origin.y = 0
}

//MARK: 사용자가 텍스트뷰에 입력을 시작할 때 기본 안내 문구
func textViewDidBeginEditing(_ textView: UITextView) {
if textView.text == "남기고자 하는 메모가 있다면 작성해주세요." {
textView.text = ""
textView.textColor = .black
}
}

//MARK: 텍스트뷰가 비어있을 때 안내 메시지를 다시 표시
func textViewDidEndEditing(_ textView: UITextView) {
if textView.text.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
textView.text = "남기고자 하는 메모가 있다면 작성해주세요."
Expand All @@ -251,6 +258,7 @@ final class PinEditViewController: UIViewController, UITextViewDelegate {
}
}

//MARK: PinEditViewController 내에서 사진 선택 기능을 쉽게 사용
extension PinEditViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let selectedImage = info[.editedImage] as? UIImage ?? info[.originalImage] as? UIImage {
Expand Down