사진 추가하기
## 🎯주요 작업
- [x] 사진 추가하기 동작
- [x] 터치가 될때마다 사진이 있으면 선택, 빈영역을 선택할 경우 선택취소
- [x] 선택되면 테두리에 선을 표시
- [x] 배경색 지원 X, 투명도만 지원
- [x] 사진 불러오기
- [x] 앨범에서 원하는 사진을 선택가능
- [x] 불러온 사진은 바이너리 형태로 메모리에서만 데이터관리한다.
- [x] 화면에 추가한 뷰 이외에 사진 데이터만 관리하는 모델타입을 선언한다.
## 📚학습 키워드
### URL
Uniform Resource Locator 자원을 가리키는 주소
모든 자원은 각각 고유한 URL을 가지고 있으며, 이를 통해 해당 자원에 접근할 수 있음.
### ImageView - 두번째 미션 1일차, 첫번째 미션 5일차
- **UIImageView**는 내부적으로 하나의 **UIImage**를 관리하는 뷰
- **UIImage**는 이미지 데이터를 나타내는 객체
- 이미지 뷰 속성들
### PhotoPicker - 첫번째 미션 5일차
- 사용자의 미디어를 선택할 수 있는 뷰 컨트롤러
- **UIImagePickerController**
- **PHPickerViewController (iOS 14이상 권장) 최신**
1. 인스턴스 생성
2. 델리게이트 설정
3. **present**
## 💻고민과 해결
### 1. 사진 추가할 때 입력-처리-출력을 구분하도록 노력하였습니다.
### 2. plane 모델과 photo모델의 공통된 동작이 보여서 추상화해야겠다고 생각했습니다. (ISP원칙 의도하도록 노력)
### Notification을 보내는 객체와 받는 객체 중에 어떤 객체와 더 관련이 높을까?
저는 보내는 객체가 더 관련성이 높다고 생각합니다.
물론 받는, 보내는 둘다 관련이 있지만 보내는 객체가 밀접한 관련이 있다고 생각합니다.
왜냐하면 결국 객체의 상태를 변화하는 것을 나타내기 때문입니다.
### **[에러] Missing package product **
[해결] File > Swift Packages > Reset Package Caches
## 🤔결과
![사진추가하기_결과](https://github.com/codesquad-members-2024/swift-drawing/assets/104732020/9de053bb-9cf3-40d7-8dcd-4d4088285ce0)
## 📚추가학습
### addTarget와 removeTarget 두 메서드의 공통 파라미터
- target: 액션이 호출될 객체, nil일 경우 모든 이벤트도 받을 수 있다.
- action: 실행할 메서드를 가리키는 selector, nil일 경우 target에 대해 모든 액션을 의미한다.
- for: 이벤트 타입을 지정한다. 예시) .touchInside
### addTarget removeTarget
특정 이벤트가 발생했을 때 실행하는 액션 메서드
### removeTarget
버튼에서 특정 액션을 제거하는데 사용하는 메서드
- target = nil, action = nil 인 경우: 지정된 이벤트에 대해 모든 타겟과 액션을 제거한다
- action = nil 인 경우: 지정된 타겟에 대해 모든 액션을 제거한다
- 둘다 nil이 아닌 경우: 모든 타겟에서 지정된 액션을 제거 한다.
터치와 드래그
## 🎯주요 작업
- [x] 제스처인식기 동작 방식 학습하고, Delegate로 제스처 처리하기
- [x] 두 손가락을 터치를 기준으로 드래그 구현
- [x] Pan 제스처 인식기 추가해서 구현
- [x] 사각형과 사진 모두 이동 가능하기
- [x] 드래그 하는 동안 선택한 것을 캡쳐하고 투명도를 0.5 정도 임시뷰를 표시하기
- [x] 손가락이 떨어지면 임시 뷰 사라짐, 선택한 뷰는 해당 위치 이동
- [x] 다른 뷰와 겹치더라도 생성한 순서에 따라서 위 또는 아래 위치
- [x] 화면에 보이는 뷰 좌표 뿐만 아니라 내부에서 처리하는 데이터 좌표도 변경
## 📚학습 키워드
### **UIGestureRecognizer - 세번째 미션 3일차**
### **snapshotView(afterScreenUpdates:)**
호출하는 당시의 뷰와 동일한 형태로 복사한다.
- afterScreenUpdates가 true인 경우 - 애니메이션과 같은 뷰 커밋이 끝난 경우 캡쳐
- afterScreenUpdates가 false인 경우 - 해당 시점에 바로 캡쳐
### UIPanGestureRecognizer.state
## 💻고민과 해결
### [버그] imageData로 뷰를 찾는데 이미지의 고유성을 보장하지 않는다. (같은 사진이 2장인 경우)
→ uniqueID으로 찾기
→ 리팩토링하다보니 굳이 UIView 하위가 UIImageView인데 따로 데이터 관리하는 것이 비효율적으로 생각함.
→ 하나의 딕셔너리에 모아서 관리하도록 하였음.
### [버그] 탭 제스처와 펜 제스처가 충돌하는 느낌이 듦.
→ 델리게이트 이용해서 탭 제스처가 되어서 테두리 선택이 되었을 때만 펜 제스처가 되도록 구현
### CGPoint, CGRect,frame,bound가 헷갈려서 노가다로 원하는 결과를 구현하였다.
→ 세번째 미션 2일차 좌표시스템 학습
## 🤔결과
![터치와드래그](https://github.com/codesquad-members-2024/swift-drawing/assets/104732020/298639e6-4cb8-4f68-94f6-d4b6c7463214)
사진 추가하기
## 🎯주요 작업 - [x] 사진 추가하기 동작 - [x] 터치가 될때마다 사진이 있으면 선택, 빈영역을 선택할 경우 선택취소 - [x] 선택되면 테두리에 선을 표시 - [x] 배경색 지원 X, 투명도만 지원 - [x] 사진 불러오기 - [x] 앨범에서 원하는 사진을 선택가능 - [x] 불러온 사진은 바이너리 형태로 메모리에서만 데이터관리한다. - [x] 화면에 추가한 뷰 이외에 사진 데이터만 관리하는 모델타입을 선언한다. ## 📚학습 키워드 ### URL Uniform Resource Locator 자원을 가리키는 주소 모든 자원은 각각 고유한 URL을 가지고 있으며, 이를 통해 해당 자원에 접근할 수 있음. ### ImageView - 두번째 미션 1일차, 첫번째 미션 5일차 - **UIImageView**는 내부적으로 하나의 **UIImage**를 관리하는 뷰 - **UIImage**는 이미지 데이터를 나타내는 객체 - 이미지 뷰 속성들 ### PhotoPicker - 첫번째 미션 5일차 - 사용자의 미디어를 선택할 수 있는 뷰 컨트롤러 - **UIImagePickerController** - **PHPickerViewController (iOS 14이상 권장) 최신** 1. 인스턴스 생성 2. 델리게이트 설정 3. **present** ## 💻고민과 해결 ### 1. 사진 추가할 때 입력-처리-출력을 구분하도록 노력하였습니다. ### 2. plane 모델과 photo모델의 공통된 동작이 보여서 추상화해야겠다고 생각했습니다. (ISP원칙 의도하도록 노력) ### Notification을 보내는 객체와 받는 객체 중에 어떤 객체와 더 관련이 높을까? 저는 보내는 객체가 더 관련성이 높다고 생각합니다. 물론 받는, 보내는 둘다 관련이 있지만 보내는 객체가 밀접한 관련이 있다고 생각합니다. 왜냐하면 결국 객체의 상태를 변화하는 것을 나타내기 때문입니다. ### **[에러] Missing package product터치와 드래그
## 🎯주요 작업 - [x] 제스처인식기 동작 방식 학습하고, Delegate로 제스처 처리하기 - [x] 두 손가락을 터치를 기준으로 드래그 구현 - [x] Pan 제스처 인식기 추가해서 구현 - [x] 사각형과 사진 모두 이동 가능하기 - [x] 드래그 하는 동안 선택한 것을 캡쳐하고 투명도를 0.5 정도 임시뷰를 표시하기 - [x] 손가락이 떨어지면 임시 뷰 사라짐, 선택한 뷰는 해당 위치 이동 - [x] 다른 뷰와 겹치더라도 생성한 순서에 따라서 위 또는 아래 위치 - [x] 화면에 보이는 뷰 좌표 뿐만 아니라 내부에서 처리하는 데이터 좌표도 변경 ## 📚학습 키워드 ### **UIGestureRecognizer - 세번째 미션 3일차** ### **snapshotView(afterScreenUpdates:)** 호출하는 당시의 뷰와 동일한 형태로 복사한다. - afterScreenUpdates가 true인 경우 - 애니메이션과 같은 뷰 커밋이 끝난 경우 캡쳐 - afterScreenUpdates가 false인 경우 - 해당 시점에 바로 캡쳐 ### UIPanGestureRecognizer.state ## 💻고민과 해결 ### [버그] imageData로 뷰를 찾는데 이미지의 고유성을 보장하지 않는다. (같은 사진이 2장인 경우) → uniqueID으로 찾기 → 리팩토링하다보니 굳이 UIView 하위가 UIImageView인데 따로 데이터 관리하는 것이 비효율적으로 생각함. → 하나의 딕셔너리에 모아서 관리하도록 하였음. ### [버그] 탭 제스처와 펜 제스처가 충돌하는 느낌이 듦. → 델리게이트 이용해서 탭 제스처가 되어서 테두리 선택이 되었을 때만 펜 제스처가 되도록 구현 ### CGPoint, CGRect,frame,bound가 헷갈려서 노가다로 원하는 결과를 구현하였다. → 세번째 미션 2일차 좌표시스템 학습 ## 🤔결과 ![터치와드래그](https://github.com/codesquad-members-2024/swift-drawing/assets/104732020/298639e6-4cb8-4f68-94f6-d4b6c7463214)