[ ] 뒤로가면 정보 날라가는거(확인된 뷰: PatientInfoView, AddressFormView에서는 안그럼/ 비니,준유폰에서 발생 / 에렌폰은 괜찮은듯(버전문제인지는 모름)) ⇒ iOS16대응하기 ⇒ 에렌/비니/준유
[x] PatientInfoView 전화번호 없어요를 눌렀을 때 다음버튼 비활성되는 경우가 있음 ⇒ 에렌
[x] 정규표현식 적용
[x] (틀렸을 경우) textfield를 만든다
[x] 스크롤 내려갈때 상단은 고정시키기
[x] 메인뷰의 패딩 20임
[x] patientinfoview에서 알림 패딩이 작음
[x] 온봄 윗쪽 패딩 넣기 조금
[x] 광고 한방향으로 움직이기
[x] PatientInfoView 버튼 높이 늘리기
[x] 카카오와 파베auth 패키지 빼기
[x] homenavigation만 dismiss 가능한 이슈 해결하기
[x] 파베에 문서 보내기
[x] 자간 넣어보기
[x] 버튼 애니메이션 >>>> 디자인 피드백 받기
[x] 모든 뷰에 keyboard 버튼을 적용하기
해결완료 문제상황
## 문제상황
```swift
// NavigationBarBackButton.swift
struct NavigationBarBackButton: View {
@EnvironmentObject var homeNavigation: HomeNavigationViewModel
```
dismiss 버튼이 HomeNavigationViewModel에 대한 의존성만 가지고 있다. 만약 ProfileNavigationViewModel이 생긴다면 dismiss가 안되는 문제가 발생한다. dismiss 버튼이 구현클래스에 의존하지 않고 추상클래스에 의존하도록 수정해준다.
### 시도1
protocol을 이용한 방법, 추상화
```swift
// HomeNavigationViewModel.swift
protocol MyNavigation: ObservableObject {
associatedtype RouteType
var homePath: [RouteType] { get }
}
class HomeNavigationViewModel: MyNavigation {
typealias RouteType = T
@Published var homePath: [T] = []
```
HomeNavigationViewModel의 protocol을 만들고, dismiss 버튼은 protocol을 의존하도록 만든다.
하지만
```swift
// NavigationBarBackButton.swift
struct NavigationBarBackButton: View {
@EnvironmentObject var homeNavigation: MyNavigation
// err: Type 'any MyNavigation' cannot conform to 'ObservableObject'
```
에러가 발생한다. MyNavigation은 ObservableObject를 채택하지만 xcode는 아니라고 설명한다.
swiftui는 EnvironmentObject가 protocol타입일 때, EnvironmentObject에 대한 의존성 주입을 아직 지원하지 않는 듯 보인다.
하지만 EnvironmentObject가 class 타입인 경우는 가능하다. 상속을 이용한 방법으로 다시 시도해본다.
(참고: https://forums.swift.org/t/using-mock-protocol-as-environmentobject/64199)
### 시도2
상속을 이용한 방법, 다형성
```swift
// HomeNavigationViewModel.swift
class MyNavigation: ObservableObject {
func navigate(_ route: T) { }
func pop() { }
func popToRoot() { }
}
class HomeNavigationViewModel: MyNavigation {
@Published var homePath: [T] = []
override func navigate(_ route: T) {
```
base class, `MyNavigation`를 만들어준다
```swift
// NavigationBarBackButton.swift
struct NavigationBarBackButton: View {
@EnvironmentObject var homeNavigation: MyNavigation
// err: Thread 1: Fatal error: No ObservableObject of type MyNavigation found
```
generic 타입을 가진 클래스를 못 찾는듯 보인다.
#### 의문
swiftui에서 제공하는 `@Environment(\.dimiss) var dismiss()`는 NavigationStack을 찾아서 현재 보여지는 화면을 dismiss를 해주는데
어떻게 해준걸까?
### 시도3
uikit의 기능을 이용
```swift
@Published var homePath: [HomeRoute] = [] {
willSet(newPath) {
let animation = CATransition()
animation.isRemovedOnCompletion = true
animation.duration = 0.1
UIApplication.shared.keyWindow?.layer.add(animation, forKey: nil)
}
}
```
uikit을 사용한 방법은 아래와 같은 문제가 있다.
- 예쁘게 동작하지 않는다.
- deprecated한 문법이라고 경고문을 남긴다.
- duration이 큰 animation은 동작하는데, 0.1처럼 숫자가 작으면 동작하지 않는다.
## 해결책
navigaitonStack을 3개를 만들어서 MainView의 각 탭마다 하나씩 할당하려고 했다.
하지만 dismiss 버튼이 모든 navigationStack을 참조할 수 없는 문제가 있다.
그래서 나는 하나의 navigationStack을 사용하여 이 문제를 해결하고자 한다.
```swift
struct NavigationBarBackButton: View {
@EnvironmentObject var homeNavigation: HomeNavigationViewModel
```
( 지금은 `homeNavigation`이라고 했지만 해결책이 채택된다면 `navigation`으로 이름이 변경될 것같다. )
### 사이드 이펙트
하지만 이 방법에도 문제가 있다.
앱은 하나의 navigationStack만 사용하니 모든 뷰는 HomeNavigationViewModel에 종속적이다.
만약 어떤 뷰에서 navigation animation이 들어간다는 요청이 왔을 때 불가능하다.
디자인 팀과 협의해서 모든 뷰에 animation이 없는 것인지 확인해봐야 겠다. 만약 animation이 필요한 뷰가 있다면 해당 방법을 철회할 것이다.
디자인 팀의 답변) 애니메이션이 없다면 모두 없어야 한다고 한다. 이제 navigationStack 하나로 진행하면 된다
키보드 버튼 이슈
## 키보드 위 버튼
키보드에 버튼이 안붙는 이슈
기존코드
```swift
if isKeyboardVisible {
CTAButton.CustomButtonView(style: .expanded(isDisabled: !isActiveButton())) {
onClickButton()
} label: {
Text("다음")
}
}
```
keyboard가 올라오면 버튼이 보이게끔 만들어주었다. 하지만 영상에서 보다시피 버튼이 위에서 떨어지는 이슈가 있었다.
해당 이슈를 해결하기 위해 swiftui에서 제공하는 toolbar를 이용하고자 한다
```swift
.toolbar {
ToolbarItemGroup(placement: .keyboard) {
Text("다음")
.B1()
.foregroundColor(Color.W)
.padding(.bottom, 3)
.frame(width: UIScreen.main.bounds.size.width + 100, height: 54)
.background(Color.red.opacity(0.5))
.simultaneousGesture(
DragGesture(minimumDistance: 0)
.onChanged { _ in
withAnimation {
isPressed = true
}
}
.onEnded { _ in
withAnimation{
isPressed = false
}
if isActiveButton() {
onClickButton()
...
```
toolbar는 버튼이 안들어가기 때문에 버튼을 커스텀해서 넣어주었다.
하지만 이것도 이슈가 있었다. 버튼의 배경을 반투명하게 만들었다. 빨간 배경 뒤에 회색 배경이 존재하는데, 회색 배경의 영역이 바로 toolbar다.
회색 배경을 터치하면 Gesture가 동작하지만, 빨간 배경만 있는 영역을 터치하면 Gesture가 동작하지 않는다.
## 해결책
돌고 돌아 ignoresSafeArea가 keyboard도 지원한다는 사실을 알게되었다.
첫번째 코드의 버튼 아래에 `.ignoresSafeArea(.keyboard, edges: .bottom)` modifier를 추가하니 문제를 해결할 수 있었다.
개요
쇼케이스 이전에 다 못한 것들을 마저 한다
📝 To-do
patientinfoview에서 알림 패딩이 작음자간 넣어보기모든 뷰에 keyboard 버튼을 적용하기해결완료
문제상황
## 문제상황 ```swift // NavigationBarBackButton.swift struct NavigationBarBackButton: View { @EnvironmentObject var homeNavigation: HomeNavigationViewModel키보드 버튼 이슈
## 키보드 위 버튼 키보드에 버튼이 안붙는 이슈 기존코드 ```swift if isKeyboardVisible { CTAButton.CustomButtonView(style: .expanded(isDisabled: !isActiveButton())) { onClickButton() } label: { Text("다음") } } ``` keyboard가 올라오면 버튼이 보이게끔 만들어주었다. 하지만 영상에서 보다시피 버튼이 위에서 떨어지는 이슈가 있었다. 해당 이슈를 해결하기 위해 swiftui에서 제공하는 toolbar를 이용하고자 한다 ```swift .toolbar { ToolbarItemGroup(placement: .keyboard) { Text("다음") .B1() .foregroundColor(Color.W) .padding(.bottom, 3) .frame(width: UIScreen.main.bounds.size.width + 100, height: 54) .background(Color.red.opacity(0.5)) .simultaneousGesture( DragGesture(minimumDistance: 0) .onChanged { _ in withAnimation { isPressed = true } } .onEnded { _ in withAnimation{ isPressed = false } if isActiveButton() { onClickButton() ... ``` toolbar는 버튼이 안들어가기 때문에 버튼을 커스텀해서 넣어주었다. 하지만 이것도 이슈가 있었다. 버튼의 배경을 반투명하게 만들었다. 빨간 배경 뒤에 회색 배경이 존재하는데, 회색 배경의 영역이 바로 toolbar다. 회색 배경을 터치하면 Gesture가 동작하지만, 빨간 배경만 있는 영역을 터치하면 Gesture가 동작하지 않는다. ## 해결책 돌고 돌아 ignoresSafeArea가 keyboard도 지원한다는 사실을 알게되었다. 첫번째 코드의 버튼 아래에 `.ignoresSafeArea(.keyboard, edges: .bottom)` modifier를 추가하니 문제를 해결할 수 있었다.참고
https://lateral-donkey-cf6.notion.site/381eae5b22aa4372848b08549eed637c?pvs=4